Executors.newCachedThreadPool 源码解析

标签: jdk源码 concurrent
8人阅读 评论(0) 收藏 举报
分类:

Executors 还有个常用静态方法newCachedThreadPool(),来构造线程池
今天我们其源码实现,探一探究竟

//底层还是调用ThreadPoolExecutor,不过参数有变化
//corePoolSize 竟然为0,maximumPoolSize为默认的最大值
//当任务队列满时,就会判断maximumPoolSize大小
//keepAliveTime 空闲线程的最大等待时间,,60s后立马销毁线程了
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

SynchronousQueue

注意这个队列

A {@linkplain BlockingQueue blocking queue} in which each insert
 * operation must wait for a corresponding remove operation by another
 * thread, and vice versa.  A synchronous queue does not have any
 * internal capacity, not even a capacity of one. 
  • SynchronousQueue,实际上它不是一个真正的队列,因为它不会为队列中元素维护存储空间。与其他队列不同的是,它维护一组线程,这些线程在等待着把元素加入或移出队列。
  • 在使用SynchronousQueue作为工作队列的前提下,客户端代码向线程池提交任务时,而线程池中又没有空闲的线程能够从SynchronousQueue队列实例中取一个任务,那么相应的offer方法调用就会失败(即任务没有被存入工作队列)。此时,ThreadPoolExecutor会新建一个新的工作者线程用于对这个入队列失败的任务进行处理(假设此时线程池的大小还未达到其最大线程池大小maximumPoolSize)。

newFixedThreadPool 和 newCachedThreadPool最大差别就是 队列,线程回收的时间

newFixedThreadPool 应用场景

 Creates a thread pool that creates new threads as needed, but
     * will reuse previously constructed threads when they are
     * available.  These pools will typically improve the performance
     * of programs that execute many short-lived asynchronous tasks.
     * Calls to <tt>execute</tt> will reuse previously constructed
     * threads if available. If no existing thread is available, a new
     * thread will be created and added to the pool. Threads that have
     * not been used for sixty seconds are terminated and removed from
     * the cache. Thus, a pool that remains idle for long enough will
     * not consume any resources.

newFixedThreadPool 线程池的数量是不确定的,可以无限大。
它比较适合处理执行时间比较小的任务

查看评论

[笔记][Java7并发编程实战手册]4.2 创建线程执行器newCachedThreadPool无界线程池

[笔记][Java7并发编程实战手册]系列目录简介在jdk api中的介绍如下一部分,其他的请查看api文档   ThreadPoolExecutor是一个一个 ExecutorService,它...
  • mr_zhuqiang
  • mr_zhuqiang
  • 2015-08-24 22:27:55
  • 2845

Executors 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

1、new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { public void r...
  • Joker_honey
  • Joker_honey
  • 2016-08-31 11:58:51
  • 386

【Java并发编程】之十九:并发新特性—Executor框架与线程池(含代码)

在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框...
  • mmc_maodun
  • mmc_maodun
  • 2013-12-23 08:17:07
  • 58105

Java线程池(newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool 、newSingleThreadExector )

1、new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public vo...
  • u011630575
  • u011630575
  • 2016-04-01 15:44:50
  • 1696

Executors.newCachedThreadPool();和Executors.newFixedThreadPool(int n)的区别

public static ExecutorService newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任...
  • limuzi13
  • limuzi13
  • 2016-05-27 16:12:31
  • 645

一个newCachedThreadPool引发的案例

记录一个案例: 有一个服务由10来台机器组成一个集群,之前的少量内部通讯使用的是redis 的 pub/sub, 发现部分机器的redis的 sub无法正常工作。 追查日志发现: 1...
  • ywj776199845
  • ywj776199845
  • 2015-07-12 16:12:43
  • 2697

使用无限大小线程池 newCachedThreadPool 可能遇到的问题

看一段测试代码:  package com.wenniuwuren.concurrent; import java.util.concurrent.ExecutorService; import ...
  • wenniuwuren
  • wenniuwuren
  • 2016-06-17 15:11:08
  • 13877

深入浅出多线程(4)对CachedThreadPool OutOfMemoryError难题的一些想法

本系列文章导航深入浅出Java多线程(1)-方法 join 深入浅出Java多线程(2)-Swing中的EDT(事件分发线程) 深入浅出多线程(3)-Future异步模式以及在JDK1.5Concur...
  • hemingwang0902
  • hemingwang0902
  • 2009-09-16 10:22:00
  • 2752

java并发包中的线程池(ThreadPoolExecutor参数及特点、Executors提供的四种线程池)

为什么用线程池创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率例如:记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3如果T1+T3&amp;gt;T2...
  • qq_36898043
  • qq_36898043
  • 2018-03-28 19:42:46
  • 20

ExecutorService 使用invokeAll提交多个任务并等待结果

invokeAll 可以提交多个任务,在任务完成前该方法会阻塞,直到所有任务完成或中断或超时,返回Future列表。package cn.t3; import java.util.ArrayList...
  • liangwenmail
  • liangwenmail
  • 2018-03-02 11:08:49
  • 34
    个人资料
    持之以恒
    等级:
    访问量: 2117
    积分: 322
    排名: 24万+
    文章存档
    最新评论