985研一学习日记 - 2024.11.23
一个人内耗,说明他活在过去;一个人焦虑,说明他活在未来。只有当一个人平静时,他才活在现在。
日常
1、起床6:20
2、健身1h
3、LeetCode刷了1题
4、复盘22:00
不复盘等于白学!!!
学习和感想
JUC并发编程
- Callable接口
- 是什么
- 创建线程的方法:一种是通过继承Thread类创建,另一种是通过使用Runnable创建线程
- 但是Runnable缺少一项功能,当线程终止时(run()结束时),无法使线程返回结果
- 为了使得线程结束后能够返回结果,Java提供了Callable接口
- 通过Callable接口来创建线程可以有返回值,Callable接口创建线程可以有返回值
- Callable接口有返回值,Runnable接口没有返回值
- Callable接口会抛出异常,Runnable接口不会抛出异常
- Callable接口使用call()创建线程并返回结果,Runnable接口使用run()实现创建线程
- Callable创建线程
- 实现Callable接口,重写内部的 call() 方法,会返回结果
- Runnable接口创建线程是将一个Runnable接口的实现类对象作为参数传入到Thread来创建线程
- 但Callable接口和Runnable接口创建线程的形式不一样,此时应该找一个类,既和Runnable有关系,又和Callable有关系
- 此时可以通过Runnable接口的FutureTask实现类来根据Callable接口创建线程
- 使用Callable接口创建的线程可以获得结果
- Callable接口不可以直接替代Runnable接口作为参数传入Thread,此时需要找FutureTask实现类(Runnable接口实现类)作为中介传入Callable接口实现类来创建线程
- FutureTask实现类
- FutureTask类是Runnable接口的实现类,在创建时可以传入Callable接口的实现类
- 创建FutureTask类时可以传入Callable接口实现类,此时通过call()方法来执行线程的操作并返回结果
- 可以直接使用lambda表达式来声明函数式接口,故FutureTask类可以获得线程返回的结果
- FutureTask原理
- 开启一个线程去完成某个任务,然后可以获得任务结果
- 可以通过Callable接口实现类来创建FutureTask对象
- 使用FutureTask单开一个线程执行某些操作,然后主线程继续执行,过一段时间后获得FutureTask线程的结果
- FutureTask只需要汇总一次,即只需要获得一次结果就可以
- FutureTask创建线程
- 传入Callable接口的实现类,或者使用lambda表达式来创建FutureTask对象
- 此时创建线程后就会执行重写的call()函数中的操作,并可以通过FutureTask对象来获得函数执行的结果
- 先传入Callable接口实现类(可以lambda表达式)来创建一个FutureTask对象,然后再创建线程Thread时传入创建的FutureTask对象,此时创建的线程就会执行call()中的操作,然后通过FutureTask对象获得结果
- 使用FutureTask时只会执行一次call()中的操作,第二次获得结果时就直接返回,不会再执行线程
- 是什么