java并发编程实战------线程池的使用

1、在任务和执行策略之间的隐性耦合,有些任务须要明确指定执行策略数据库

一、依赖性任务:提交到线程池的任务依赖其余的任务;安全

二、使用线程封闭机制的任务:单线程任务变为并发时失去线程安全性;网络

三、对响应时间敏感的任务:一个任务长时间执行或者多个长时间任务在数量少的线程池中,下降了线程池 对任务的响应性;并发

综上,只有同类型且互相独立的任务才能使线程池达到最佳性能。函数

1.1 Thread Starvation Deadlock线程饥饿死锁:线程池中的任务须要无限期等待一些必须由池中其余任 务才能提供的资源或条件,在线程池不是无限大时会发生线程饥饿死锁。(跑了两个互相依赖的任务提交到单线程线程池时饥饿死锁问题,运行试过了这状况其实严格说不是死锁,而是其中一个任务在无限期等待另外一个任务,而另外一个任务不会执行)性能

1.2 运行时间较长的任务:线程数过少,运行时间较长,会致使线程池中任务阻塞;线程

2、线程池的大小:通常不会固定,应该基于某种机制来配置,或者根据Runtime.getRuntime().availableProcessors()来配置。队列

计算密集型任务:计算机大部分CPU消耗在计算、循环、逻辑判断上面,叫作计算密集型任务; IO密集型任务:频繁的网络IO、硬盘文件IO、其余设备IO,叫作IO密集型任务;内存

计算密集型任务在cpu个数+1时一般能够获得最好的CPU利用率; IO密集型任务的线程数最优是:NU(1 + W/C),N是CPU个数,U是CPU利用率,W/C是cpu等待时间与计算时间对比。也有其余状况:线程池和资源池相互制约的状况,好比线程池和数据库链接池的状况,若是每一个任务都须要数据库链接,那么链接池的链接数就限制了线程池的大小;资源

3、配置ThreadPoolExecutor 一、线程的建立和销毁,取决于线程池的参数:基本大小、最大大小、存活时间; 二、管理队列任务:比较稳妥的资源管理策略是使用有界工做队列,且有界工做队列的大小与线程池大小须要一块儿调节,好比:大队列和小线程池虽然能够下降内存使用量,下降CPU使用率,减小上下文切换,可是会限制吞吐量;对于很大的线程池或者无界线程池则应该使用Synchronous同步移交来做为任务队列; 三、饱和策略RejectExecutionHandler:AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy 四、线程工厂:一、为线程指定名称;二、指定定制的UncaughtExceptionHandler、 五、执行构造函数后还能够定制ThreadPoolExecutor。

4、扩展ThreadPoolExecutor,可经过实现beforeExecute afterExecute terminated 三个方法来扩展一些定制功能,好比执行时间 任务总数 总的执行时间等。

相关文章
相关标签/搜索