环境
java1.8、idea2018、springboot
帮助人群
java软件工程师、java后端开发、准备面试的java软件开发、多线程
Callable和Future
Callable和Future解决了Runnable不能返回值或抛出异常的问题。
Future:可以用来查看任务的生命周期以及操作任务,如获取任务结果、取消任务
方法:
- cancel():尝试取消任务。
- isCancelled():
- isDone():
- get():返回计算结果。
- get(timeout):可以设置超时时间。
总结
- 多线程不要乱用,尽量先串行,当生产环境真的不能应付在考虑并行。
- 面试多线程时,多多结合实战跟面试官分讲讲。
线程池【概念复习】
作用:
(1)、通过重复利用线程,减少线程的创建销毁损耗的资源
(2)、提高响应速度,任务到达时,不用重新创建线程,之间可以使用已经创建好的线程执行。
(3)、提高线程的可管理性
ThreadPoolExecutor可配置项:
- 线程池初始大小
- 最大大小
- 存活时间
线程的开销
- 生命周期的开销:线程的创建、调度和生命周期管理都由操作系统实现,无论在哪款操作系统下,这些操作的开销都很可观。
- 内存占用:一个线程占用的栈资源大概在1-2M左右,那么线程数达到千级别时这个开销就很可观。
- 稳定性:不同操作系统和JVM配置下,线程数量将受到栈空间或系统的限制,过多的线程并不会再提升性能。
合理配置线程池大小
- 一般需要根据任务的类型来配置线程池大小:
- 如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 NCPU+1
- 如果是IO密集型任务,参考值可以设置为2*NCPU
当然,这只是一个参考值,具体的设置还需要根据实际情况进行调整,比如可以先将线程池大小设置为参考值,再观察任务运行情况和系统负载、资源利用率来进行适当调整。