ThreadPoolExecutor线程池用法研究

1.ThreadPoolExecutor

ThreadPoolExecutor线程池用法研究_第1张图片


参考:http://dlc.sun.com.edgesuite.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html/zh_CN/api/index.html?java/util/concurrent/ThreadPoolExecutor.html

2.ThreadPoolExecutor执行流程

1)首先线程池判断基本线程池是否已满?没满,创建一个工作线程来执行任务。满了,则进入下个流程。
2)线程池判断工作队列是否已满?没满,则将新提交的任务存储在工作队列里。满了,则进入下个流程。
3)最后线程池判断最大线程池是否已满?没满,则创建一个新的工作线程来执行任务,满了,则交给饱和策略来处理这个任务。

3. 定制线程池大小

线程池大小取决于被提交任务的类型和服务器的性能。
cpu ,内存
任务类型(计算密集型,io密集型)

int N = Runtime.availableProcessors();

计算密集型:N+1

IO密集型如(套接字等阻塞任务),由于线程并非一直运行,因此线程池规模应该更大。通过使用分析,可以估计某个典型请求的等待时间(WT)与实际占用CPU进行运算的时间(ST)之间的比例,这个估算不需要很精确。如果我们将这一比例称之为 WT/ST,那么对于一个具有 N 个处理器的系统,需要设置大约 N*(1+WT/ST) 个线程来保持处理器得到充分利用

幸运的是,设置线程池的大小并不困难,只需要避免过大或过小这两种极端情况。

如果线程过大,大量的线程将在相对很少的cpu和内存资源上竞争,这不仅导致更高内存使用,而且可能导致资源耗尽。

如果线程池过小,将导致许多空闲的处理器无法工作,cpu利用率低,从而降低吞吐率。



你可能感兴趣的:(ThreadPool)