- 课程名称:线程八大核心+Java并发原理精讲及企业级并发解决方案
- 章节名称:
- 第2章:线程八大核心纵观全貌:复习
- 讲师姓名:悟空
- 时间:2022-11-08 23:38
课程内容
-
实现多线程的方法
-
Oracle官网文档说有两种方法
-
实现Runnable接口
public class RunableStyle implements Runnable { @Override public void run() { System.out.println("Runable style"); } public static void main(String[] args) { new Thread(new RunnableStyle()).start(); } }
-
继承Thread类
public class ThreadStyle extends Thread { @Override public void run() { System.out.println("Thread style"); } public static void main(String[] args) { new ThreadStyle().start(); } }
-
两种方法的对比
- 实现
Runnable
接口更好一些 - 继承
Thread
有什么缺点- 线程实现方法都是
run()
方法,这个方法应该和线程的创建与运行机制相隔离,即解耦,但继承这个类,重写run()
方法,使得线程类本身与业务代码绑定在了一起 - 如果想新建一个任务,就必须要创建一个新的线程,而这个过程非常消耗系统资源
- 而使用
Runnable
接口就可以利用后续的线程池工具,可以完全避免上述问题
- 线程实现方法都是
- 实现
-
-
-
思考题:同时使用上述的创建线程的两种方法会怎么样?
-
两种创建线程方法
- 继承Thread类,并重写run()方法
- 实现Runnable接口,并实现run()方法
-
把这个两种实现都写在一个类内会出现什么结果,是重写的run()方法被执行,还是实现的run()方法被执行?
public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { System.out.println("Runnable implements"); } }) { @Override public void run() { System.out.println("Thread extends"); } }.start(); }
-
上述代码的写法,感觉两个方法都可以执行,正确判断执行结果,需要查看Thread类的源代码
// Thread类run()方法源代码写法 public void run() { if (target != null) { target.run(); } }
-
上面代码中
target
代表线程类对象,可以执行外部传入的线程对象- 而当把两种执行方法都写在一个类中,Thread类中的
run()
方法就被覆盖,即target
即使被传入,但覆写的代码中,没有对这个对象的调用代码,也就是说,传入的线程对象不会被执行 - 所以最终执行结果内容就为:
Thread extends
- 而当把两种执行方法都写在一个类中,Thread类中的
-
-
最精确的总结
- 创建线程只有一种方式,那就是构造Thread类,而实现线程执行单元有两种方式
- 实现
Runnable
接口的run()
方法,并将Runnable
实例传给Thread
类 - 重写
Thread
的run()
方法(继承Thread
类)
- 实现
- 创建线程只有一种方式,那就是构造Thread类,而实现线程执行单元有两种方式
学习心得
线程的学习任重而道远