在java中实现多线程的方式有两种,一种是继承Thread类,另一个是实现Runnable接口。
对于两种实现,各有优缺点。接下来进行对比总结一下。这两种方法,都可以实现多线程。
以下为两种实现的写法
继承Thread类的方式:
package com.zc.thread;
public class MyThread extends Thread {
private String name;
public MyThread(String name) {
super();
this.name = name;
}
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("线程开始:" + this.name + ",i=" + i);
}
}
}
实现Runnable接口的方式:
package com.zc.runnable;
public class MyRunnable implements Runnable {
private String name;
public MyRunnable(String name) {
this.name = name;
}
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("线程开始:" + this.name + ",i=" + i);
}
}
}
两种方式都可以实现多线程。两种方式的区别基本就是 继承 和实现接口的区别。初次之外,就是实现Runnable接口可以实现资源的共享。
对于继承Thread类,会有一些局限性。因为java中的类不能继承多个类,但是可以实现多个接口。所以实现Runnable多少会有一些便利。
因为这两种方式,就是换汤不换药。Thread类仍然是实现的Runnable接口。
run方法 和 start方法区别:
在以上两种实现多线程的方式中,都需要重写run方法。而要想启动线程,就必须调用该类的start方法。这样JVM才会给分配一个线程。进而实现 多线线程的同步执行。即:start会协调系统的资源。
那么如何实现,多个线程之间的资源共享呢?
首先编写一个自己的Test类
package com.zc.thread;
public class SellThread extends Thread{
private int ticket = 10;
@Override
public void run() {
for (int i = 0; i < 20; i++) {
if (this.ticket > 0) {
System.out.println("卖票:ticket" +",第"+ this.ticket--);
}
}
}
}
该类为一个售票点的运营情况。
如果只有一个售票员的话,那么这个问题就不需要讨论了,这样就是一个单一的线程。直接用即可。
那么如何实现三个售票员的情况呢?接下来看一下下面这种情况:
public class ticketTest {
public static void main(String[] args) {
TicketSellThread tst1=new TicketSellThread();
TicketSellThread tst2=new TicketSellThread();
TicketSellThread tst3=new TicketSellThread();
tst1.start();
tst2.start();
tst3.start();
}
}
上面的这种情况是否可以满足 三个售票员的售票点呢?
很显然,售票的情况不对,三个售票员 售出了 总数 那么多的票,是三个人的资源 不共享造成的。
要想实现,三个售票员同享一个资源。那么就应该用同一个Thread去start 三个线程。
public static void main(String[] args) {
TicketThreadR ticketThread = new TicketThreadR();
Thread th1 = new Thread(ticketThread); //线程一
Thread th2 = new Thread(ticketThread); //线程二
Thread th3 = new Thread(ticketThread); //线程三
th1.start();
th2.start();
th3.start();
}
接下来看一下结果:
虽然打印情况不是按照顺序打印的,但是实现了资源共享。
对比来说,实现Runnable类的Thread进行start的时候,会达到资源共享。而如果使用继承Thread的实现方法来调用start资源是得不到共享的。