由于java是纯面向对象的语言,因此,java的线程模型也是面向对象的。
java通过Thread类将线程所必需的功能封装了起来。要想建立一个线程,必须要有一个线程执行函数,这个线程执行函数对应Thread类中的run方法。
Thread类中还有一个start方法,这个方法负责建立线程,相当于调用Windows的建立线程函数CreateThread。
当调用start方法后,如果线程建立成功,并自动调用Thread类的run方法。因此,任何继承Thread类的java类都可以通过Thread类的start方法来建立线程。如果想要运行自己的线程执行函数,那就要覆盖Thread类的run方法。
在java的线程模型中除了Thread类,还有一个标识某个java类是否可作为线程类的接口Runnable,这个接口只有一个抽象方法run(java的线程执行函数)。
因此,一个线程类的唯一标准就是这个类是否实现了Runnable接口的run方法,也就是说,拥有线程执行函数的类就是线程类。
从上面可以看出,在java中建立线程有两种方法:①继承Thread类;②实现Runnable接口,并通过Thread和实现Runnable的类来建立线程。
eg.
①
class MyThread extends Thread{
public void run(){……}
}
public class TestThread{
public static void main(){
Thread t1=new MyThread();
t1.start();
}
}
②
class MyThread implements Runnable{
public void run(){……}
}
public class TestThread{
public static void main(){
Runnable myThread=new MyThread();
Thread t2=new Thread(myThread);
t2.start();
}
}
本质上,其实是一种方法,即通过Thread类来建立线程,并运行run方法。
大区别是:通过继承Thread类来建立线程,虽然实现起来更容易,但是由于java不能多继承,所以这个线程类如果继承了Thread则不能再继承其他类,所以java线程模型提供了Runnable接口。