课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
线程池的学习和使用在许多软件编程开发项目中是会经常用到的一个编程技术,而本文我们就通过案例分析来简单了解一下,线程池技术应用都有哪些注意事项。
可缓存线程池,用了synchronousqueue队列,不需要存储任务,有任务进来直接创建线程,具有自动回收多余线程的功能。但是这个线程池存在一种弊端,在默认情况下,maxPoolSize被设置为Integer.MAX_VALUE,这可能会创建非常多的线程,甚至导致OOM。(注意:Cache特指的是对线程的缓存,如果一段时间线程空闲,就回收)
ScheduleThreadPool:支持定时及周期性任务执行的线程池
插曲
线程数量设定多少比较合适?
答:线程数=CPU核心数*(1+平均等待时间/平时工作时间)
关闭线程池
shutdown:运行之后并不会停止,而是会把存量的任务都执行完毕。
shutdownNow:立即停止线程,并且队列的任务也不会执行。
拒绝策略
拒绝的时机是大线程数满
AbortPolicy:默认的拒绝策略,直接抛出异常
DiscardPolicy:直接丢弃,提交线程不会收到任何信息
DiscardOldestPolicy:丢弃在队列中等待时间长的任务
CallerRunsPolicy:由提交线程执行任务,是一种负反馈机制
线程池实现任务复用的原理
核心原理是用相同的线程去执行不同的任务。先execute方法先去检查当前线程数是否小于corePoolSize,如果小于的话,则执行addWork加一个工作线程,然后会执行runWork方法,该方法先会获取一个任务task,这个task是Runnable实例,并且while循环中判断这个任务是否为空,后直接task调用run方法
在runWork方法中,会将一个个Runnable实例(也就是task)给拿到,然后直接调用run方法
面试题:submit和execute的区别
(1)类型
execute只能接受Runnable类型的任务
submit不管是Runnable还是Callable类型的任务都可以接受,但是Runnable返回值均为void,所以使用Future的get()获得的还是null
(2)返回值
由Callable和Runnable的区别可知:
execute没有返回值
submit有返回值,所以需要返回值的时候必须使用submit
(3)异常
1.execute中抛出异常
execute中的是Runnable接口的实现,所以只能使用try、catch来捕获CheckedException,通过实现UncaughtExceptionHander接口处理UncheckedException
即和普通线程的处理方式完全一致
2.submit中抛出异常
不管提交的是Runnable还是Callable类型的任务,如果不对返回值Future调用get()方法,都会吃掉异常
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。