线程池
---恢复内容开始---
我们创建一个最简单的线程如下
new Thread(new Runnable() { @Override public void run() { //do something } }).start();
1.当线程数量过大时 会耗尽CPU和内存资源
2.创建和关闭线程需要消耗时间
3.线程本身需要占用内存空间 大量的线程回收也会给GC带来负担
线程池
为了避免系统频繁的创建和销毁线程 我们可以让创建的线程进行复用 在线程池中维护一些线程 我们应用程序进行对线程池中的线程进行使用
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
一个比较特殊的队列:SynchronousQueue,没有容量可言,提交任务就意味着一直阻塞等待任务的线程立刻得到任务进行执行。说白了,就是不要暂存到队列中,任务直接提交给线程进行执行。由于任务无法暂存,因此缓存线程池会根据任务的实际情况,进行线程池的增长,直至maximumPoolSize(Integer.MAX_VALUE)。
线程池:CorePoolThread 任务队列 maximumPoolSize
1.直接提交的队列 就是不要暂存到队列中,任务直接提交给线程进行执行,进行线程池的增长,直至maximumPoolSize
2.有界的任务队列 就是任务队列有界限,一般用ArrayBlockQueue,先CorePoolThread ,然后任务队列,队列满了,maximumPoolSize
3.无界的任务队列 就是任务队列无界限,一般用LinkedBlockQueue,任务队列满不了,直到maximumPoolSize
4.优先的任务队列 特殊的无界队列,一般用PriorityBlockingQueue实现,任务有优先级
newFixedThreadPool() corepoolSize == maximumPoolSize 的LinkedBlockQueue队列,任务频繁时,迅速耗尽资源
newSingleThreadPool() corepoolSize == maximumPoolSize == 1 的LinkedBlockQueue队列,任务频繁时,迅速耗尽资源
newCachedThreadPool() corepoolSize = 0 maximumPoolSize == 无穷 SynchronousQueue队列 任务频繁时,迅速耗尽资源

浙公网安备 33010602011771号