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 类 target Thread 类 run上面两张图是 Thread 类的源码,里面是 run 方法的实现。
第一种实现方式就是将 Runnable 对象传到 target 里,然后运行传进去 Runnable 对象中的 run 方法。
第二种实现方式是重写 Thread 类中的 run 方法。
所以归根到底,新建线程的方法就是实现 Thread 类的 run 方法。
总结
既然有两种方法可以新建线程,那么那种好呢?应该是 Runnable 的方式。理由:
- 从解耦的角度,run 方法里具体的任务应该和线程的新建运行应该是解耦的,任务是任务,线程是线程。
- 如果继承了 Thread 类,每次新建任务就需要新建一个线程,而新建线程的代价是相较于 Runnable 方式来说比较大。Runnable 可以结合线程池的方式更为合理的使用资源。
- 类继承 Thread 之后,Java 又不允许多继承。那么继承 Thread 类会对代码以后的扩展掣肘。
网友评论