线程池

---恢复内容开始---

我们创建一个最简单的线程如下

        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队列  任务频繁时,迅速耗尽资源

 

posted @ 2018-07-17 09:44  Bockpecehhe  阅读(145)  评论(0)    收藏  举报