写在前面

本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java并发

解答

准确的讲创建线程只有一种方式那就是构造 Thread 类,而实现线程的执行单元有两种方式 (即run方法的两种不同实现情况)。

方法一: 实现 Runnable 接口的 run 方法,并把 Runnable 实例传给 Thread 类,再让 Thread 类去执行这个 run 方法。

方法二: 重写 Thread 的 run 方法(继承 Thread 类)。

补充

其他创建线程的方式

1.线程池创建线程
2.通过 Callable 和 FutureTask 创建线程
3.定时器创建线程
4.匿名内部类和 Lambda 表达式的方式创建线程

上面 4 种本质上都是通过构造 Thread 的方式创建的,所以不能简单的认为也是新的创建线程的方式。

实现 Runnable 接口和继承 Thread 类哪种方式更好?

1.从代码架构角度——应该去解耦,两件事情:1)具体的任务即 run 方法中的内容;2)和线程生命周期相关的如创建线程、运行线程、销毁线程即 Thread 类去做的事情。
2.从资源损耗的角度——继承 Thread 类,需要新建线程、执行完之后还要销毁,实现 Runnable 接口的方式可以反复的利用同一个线程,比如线程池就是这么做的,用于线程生命周期的损耗就减少了。
3.从扩展性角度——Java 不支持多继承的角度。

Q.E.D.


大数据开发工程师,精通 Spark,擅长 Java 和 Scala