概述
- 实现多线程的方法到底有1种还是2种还是4种?(实现多线程的典型错误和正确方法)
- 启动线程的正确和错误的方法
- 停止线程的正确方法(重要、难点)
- 线程的6个状态(线程的生命周期)
- Thread和Object类中和和线程相关的重要方法
- 线程各属性
- 线程的未捕获异常UncaughtException应该如何处理?
- 线程是把双刃剑:多线程会导致性能问题(线程引入的开销、上下文切换)
- 常见面试题
题目描述:有多少种实现线程的方法?典型错误答案和正确答案。(问题选自《常见面试题汇总》) 提示:答题思路,以下5点: 1. 从不同的角度看,会有不同的答案。 2. 典型答案是两种,分别是实现Runnable接口和继承Thread类,然后具体展开说; 3. 但是,我们看原理,其实Thread类实现了Runnable接口,并且看Thread类的run方法,会发现其实那两种本质都是一样的,run方法的代码如下:
@Override public void run() { if (target != null) { target.run(); } }方法一和方法二,也就是“继承Thread类然后重写run()”和“实现Runnable接口并传入Thread类”在实现多线程的本质上,并没有区别,都是最终调用了start()方法来新建线程。这两个方法的最主要区别在于run()方法的内容来源: 方法一:最终调用target.run(); 方法二:run()整个都被重写
4. 然后具体展开说其他方式:还有其他的实现线程的方法,例如线程池、定时器,它们也能新建线程,但是细看源码,从没有逃出过本质,也就是实现Runnable接口和继承Thread类。 5. 结论:我们只能通过新建Thread类这一种方式来创建线程,但是类里面的run方法有两种方式来实现,第一种是重写run方法,第二种实现Runnable接口的run方法,然后再把该runnable实例传给Thread类。除此之外,从表面上看线程池、定时器等工具类也可以创建线程,但是它们的本质都逃不出刚才所说的范围。
以上这种描述比直接回答一种、两种、多种都更准确。
另外,Runnable传入Thread可以实现一个Runnable的多次复用