Java 创建新线程有很多种方式,归根到底只有一种方式。实现 Thread 的 run 方法。
方式1、通过 Runnable 方式实现
public class RunnableStyle implements Runnable {
public static void main(String[] args) {
Thread thread = new Thread(new RunnableStyle());
thread.start();
}
@Override
public void run() {
System.out.println("使用 Runnable 实现线程");
}
}
方式2、通过 Thread 方式实现
public class ThreadStyle extends Thread {
@Override
public void run() {
System.out.println("使用 Thread 实现线程");
}
public static void main(String[] args) {
new ThreadStyle().run();
}
}
实现原理
以上两种方式的本质都是通过 Thread 中的 run 方法实现的。
上面两张图是 Thread 类的源码,里面是 run 方法的实现。
第一种实现方式就是将 Runnable 对象传到 target 里,然后运行传进去 Runnable 对象中的 run 方法。
第二种实现方式是重写 Thread 类中的 run 方法。
所以归根到底,新建线程的方法就是实现 Thread 类的 run 方法。
总结
既然有两种方法可以新建线程,那么那种好呢?应该是 Runnable 的方式。理由:
- 从解耦的角度,run 方法里具体的任务应该和线程的新建运行应该是解耦的,任务是任务,线程是线程。
- 如果继承了 Thread 类,每次新建任务就需要新建一个线程,而新建线程的代价是相较于 Runnable 方式来说比较大。Runnable 可以结合线程池的方式更为合理的使用资源。
- 类继承 Thread 之后,Java 又不允许多继承。那么继承 Thread 类会对代码以后的扩展掣肘。