java并发编程实战读书笔记:线程池的使用

任务与策咯之间的耦合

上文中说了java通过excutor框架把任务的执行和提交解耦了,实际上对于任务和执行策咯,有时候是有一定的耦合的,并不是所有的任务都能用任意的执行策略。比如,一个任务依赖别的任务,只能在一个线程里执行的任务,响应特别敏感的任务(GUI),这些任务都不能用普通的线程池从,而是要为任务定制相应的执行策略。当任务彼此独立,且类型相同时,线程池能发挥最大的作用

线程饥饿死锁

当线程池里的某个任务依赖其他任务的时候,可能产生死锁,如果任务在单线程线程池,线程池的大小不够大,或都依赖有限的资源(如JDBC连接池)的时候,就可能由于等待产生死锁

运行时间较长的任务

如果线程池中某些任务运行时间很长,且线程池的大小不够大,那么会使得线程池短时间无响应

设置线程池的大小

可以根据应用程序的执行情况设置线程池大小,CPU密集型可以设置线程个数为CPU数目+1,IO密集型可以设置多一些,可以事先观察CPU的使用率来设置线程池大小

配置线程池

管理任务队列

在线程池中,可以手动设置任务队列,如用有界队列,同步队列(提交的同时分配线程执行,而不是放入队列中)

饱和策略

当线程池中队列满的时候,执行的策略就是饱和策略,可以直接拒绝任务提交,或者丢弃最老的,还可以直接使用调用线程来运行,这会使得调用线程由于运行任务暂停提交,

线程工厂

可以定制线程池中的线程工厂,使得线程池创建你所需要的线程,如线程的uncaughtexceptionhandler,打印日志,统计信息,线程取名

猜你喜欢

转载自blog.csdn.net/xuefeiliuyuxiu/article/details/80220791