1.3 CachedThreadPool

线程池工具类给我们提供了一些常见的线程池,这篇来谈一谈CachedThreadPool线程池

介绍

  1. 可缓存的线程池
  2. 无界线程池,但可以自动回收多余的线程功能

使用方式

创建方式比较简单,直接使用工具创建就ok,Executors.newCachedThreadPool()

源码

/**
     * 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 {@code execute} 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. Note that pools with similar
     * properties but different details (for example, timeout parameters)
     * may be created using {@link ThreadPoolExecutor} constructors.
     *
     * @return the newly created thread pool
     */
    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

剖析

  1. 从源码中可以看到,最大线程数是Integer最大值可以理解为无限大。
  2. 看来看一下使用了SynchronousQueue队列,SynchronousQueue我们都知道它是直接交换的队列,说明任务存储队列为0

缺点

因为使用了无界队列,那么任务可以无限制创建线程,这样做有OOM的风险。
当运行这段代码的时候最好设置一下 -Xms300m -Xmx300m

codeing

......
任务开始执行Thread[pool-1-thread-3989,5,main]
任务开始执行Thread[pool-1-thread-3990,5,main]
任务开始执行Thread[pool-1-thread-3991,5,main]
任务开始执行Thread[pool-1-thread-3992,5,main]
任务开始执行Thread[pool-1-thread-3993,5,main]
任务开始执行Thread[pool-1-thread-3994,5,main]
任务开始执行Thread[pool-1-thread-3995,5,main]
任务开始执行Thread[pool-1-thread-3996,5,main]
任务开始执行Thread[pool-1-thread-3997,5,main]
任务开始执行Thread[pool-1-thread-3998,5,main]
任务开始执行Thread[pool-1-thread-3999,5,main]
任务开始执行Thread[pool-1-thread-4000,5,main]
任务开始执行Thread[pool-1-thread-4001,5,main]
任务开始执行Thread[pool-1-thread-4002,5,main]
任务开始执行Thread[pool-1-thread-4003,5,main]
任务开始执行Thread[pool-1-thread-4004,5,main]
任务开始执行Thread[pool-1-thread-4005,5,main]
任务开始执行Thread[pool-1-thread-4006,5,main]
任务开始执行Thread[pool-1-thread-4007,5,main]
任务开始执行Thread[pool-1-thread-4008,5,main]
任务开始执行Thread[pool-1-thread-4009,5,main]
任务开始执行Thread[pool-1-thread-4010,5,main]
任务开始执行Thread[pool-1-thread-4011,5,main]
任务开始执行Thread[pool-1-thread-4012,5,main]
任务开始执行Thread[pool-1-thread-4013,5,main]
任务开始执行Thread[pool-1-thread-4014,5,main]
任务开始执行Thread[pool-1-thread-4015,5,main]
任务开始执行Thread[pool-1-thread-4016,5,main]
任务开始执行Thread[pool-1-thread-4017,5,main]
任务开始执行Thread[pool-1-thread-4018,5,main]
任务开始执行Thread[pool-1-thread-4019,5,main]
任务开始执行Thread[pool-1-thread-4020,5,main]
任务开始执行Thread[pool-1-thread-4021,5,main]
任务开始执行Thread[pool-1-thread-4022,5,main]
任务开始执行Thread[pool-1-thread-4023,5,main]
任务开始执行Thread[pool-1-thread-4024,5,main]
任务开始执行Thread[pool-1-thread-4025,5,main]
任务开始执行Thread[pool-1-thread-4026,5,main]
任务开始执行Thread[pool-1-thread-4027,5,main]
任务开始执行Thread[pool-1-thread-4028,5,main]
任务开始执行Thread[pool-1-thread-4029,5,main]
任务开始执行Thread[pool-1-thread-4030,5,main]
任务开始执行Thread[pool-1-thread-4031,5,main]
任务开始执行Thread[pool-1-thread-4032,5,main]
任务开始执行Thread[pool-1-thread-4033,5,main]
任务开始执行Thread[pool-1-thread-4034,5,main]
任务开始执行Thread[pool-1-thread-4035,5,main]
任务开始执行Thread[pool-1-thread-4036,5,main]
任务开始执行Thread[pool-1-thread-4037,5,main]
任务开始执行Thread[pool-1-thread-4038,5,main]
任务开始执行Thread[pool-1-thread-4039,5,main]
任务开始执行Thread[pool-1-thread-4040,5,main]
任务开始执行Thread[pool-1-thread-4041,5,main]
任务开始执行Thread[pool-1-thread-4042,5,main]
任务开始执行Thread[pool-1-thread-4043,5,main]
任务开始执行Thread[pool-1-thread-4044,5,main]
任务开始执行Thread[pool-1-thread-4045,5,main]
任务开始执行Thread[pool-1-thread-4046,5,main]
任务开始执行Thread[pool-1-thread-4047,5,main]
任务开始执行Thread[pool-1-thread-4048,5,main]
任务开始执行Thread[pool-1-thread-4049,5,main]
任务开始执行Thread[pool-1-thread-4050,5,main]
任务开始执行Thread[pool-1-thread-4051,5,main]
任务开始执行Thread[pool-1-thread-4052,5,main]
任务开始执行Thread[pool-1-thread-4053,5,main]
任务开始执行Thread[pool-1-thread-4054,5,main]
任务开始执行Thread[pool-1-thread-4055,5,main]
任务开始执行Thread[pool-1-thread-4056,5,main]
任务开始执行Thread[pool-1-thread-4057,5,main]
任务开始执行Thread[pool-1-thread-4058,5,main]
任务开始执行Thread[pool-1-thread-4059,5,main]
任务开始执行Thread[pool-1-thread-4060,5,main]
任务开始执行Thread[pool-1-thread-4061,5,main]
任务开始执行Thread[pool-1-thread-4062,5,main]
任务开始执行Thread[pool-1-thread-4063,5,main]
任务开始执行Thread[pool-1-thread-4064,5,main]
任务开始执行Thread[pool-1-thread-4065,5,main]
任务开始执行Thread[pool-1-thread-4066,5,main]
任务开始执行Thread[pool-1-thread-4067,5,main]
任务开始执行Thread[pool-1-thread-4068,5,main]
任务开始执行Thread[pool-1-thread-4069,5,main]
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
	at java.lang.Thread.start0(Native Method)
	at java.lang.Thread.start(Thread.java:717)
	at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:957)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1378)
	at pres.bik.lean.concurrent.CachedThreadPoolLean.main(CachedThreadPoolLean.java:18)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值