Thread和Runnable是java实现多线程的两种方式,前者需要继承,后者需要实现接口。
线程:线程是进程上的一种划分,是进程的执行单元。
进程:是具有一定独立功能,处于运行过程中的程序。一般而言,进程包括三大特征:独立性、并发性和动态性。
下面来分析Thread和Runnable的区别:
1、Thread是要实现类继承的:
public class ThreadTest extends Thread
Runnable接口要实现:
public RunnableTest implements Runnable
2、Thread:要启动一个人线程,直接调用start()方法即可;
Runnable:要启动一下线程,可以如下:
,之后调用start()即可。
3、Thread也是实现了Runnable接口的:
4、继承Thread多个线程之间不能实现资源的共享,而实现了Runnable接口之后,可以实现多个线程之间的资源共享。
下面以买票为例:
class Demo extends Thread{
//总共票数为10
private int ticket = 10;
public void run(){
while(ticket>0){
System.out.println("卖票"+":"+ticket--);
}
}
}
public class ThreadDemo03{
public static void main(String[] args){
//下面是模拟四个售票点
Demo person1 = new Demo();
Demo person2 = new Demo();
Demo person3 = new Demo();
Demo person4 = new Demo();
person1.start();
person2.start();
person3.start();
person4.start();
}
}
输出结果为:
class Demo implements Runnable{
//总共票数为10
private int ticket = 10;
public void run(){
while(ticket>0){
System.out.println("卖票"+":"+ticket--);
}
}
}
public class ThreadDemo04{
public static void main(String[] args){
//同一资源
Demo demo = new Demo();
//四个售票点,控制同一资源
new Thread(demo).start();
new Thread(demo).start();
new Thread(demo).start();
new Thread(demo).start();
}
}
输出结果为:
分析上面的结果:Thread的同一张票被多人买走,这在实际情况中是不可能发生的。而Runnable接口,输出的结果正是我们需要的。
综上所述,我们可以看出,实现Runnable接口适合处理多个线程访问同一资源的情况,可以避免由于java单继承特性带来的额局限,有利于程序的健壮性,代码能够被多个线程共享。因此,大多数情况下,建议使用Runnable接口。