首
Java的thread有两种创建方式:1、继承Thread,重写run函数;2、实现Runnable接口,用Runnable实例创建thread。你会选择哪一种?
继承
package chap15thread;
public class MyThread extends Thread {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
@Override
public void run() {
// blabla
}
}
调用Thread实例的start方法启动线程。
接口
package chap15thread;
public class MyRunnable implements Runnable {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
}
@Override
public void run() {
// blabla
}
}
首先创建Runnable实例,再用Runnable实例去创建thread。
选择
因为我们直接将测试代码写到了类里,二者看上去代码量相差不大。实际过程中,Runnable的方式会多一个步骤,先创建Runnable实例,再创建Thread实例。相比较下继承的方式会更为简单。
但在《Head First Java》这本书中,作者推荐使用接口的方式,原因有二。
1、Java不支持多继承。如果继承Thread的类还需要继承其他父类,那就必须使用接口的方式了。
2、接口的方式更符合设计模式。想想看我们为什么会用到继承,一个Dog继承了Animal,是因为Dog是一个特殊的Animal,在Animal上拓展了许多个性操作,如“品种”、“颜色”、“汪汪叫”和“撒娇”等等。但我们继承Thread的类是一个特殊的线程吗?并不是,它只是一个普通的线程,执行一个我们给予它的活儿而已,并没有比父类Thread多出个性化的东西。
尾
关于Runnable接口方式创建thread,可以把Thread想象成一个工人,干活的人。而Runnable则是活儿本身,要干的活儿。我们要做的就是把活儿创建好,然后交给工人。