前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDK线程池简析 原

JDK线程池简析 原

作者头像
克虏伯
发布2019-04-15 14:33:09
3650
发布2019-04-15 14:33:09
举报

1.CachedThreadPool

    CachedThreadPool的创建方式

ExecutorService executorService = Executors.newCachedThreadPool();
public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                    60L, TimeUnit.SECONDS,
                                    new SynchronousQueue<Runnable>());
}

    SynchronousQueue有2个方法需要注意,put和offer,put方法分情况来说:假设线程A正在waiting 从SynchronousQueue取一个元素,此时put(e),则e会被A接走,put会马上返回;假设没有线程正在waiting从SynchronousQueue取一个元素,此时put(e),则put(e)会阻塞当前的线程。put的特点是如果没有线程在waiting从SynchronousQueue取元素,则put(e)会阻塞当前线程。

    offer方法分情况来说:假设线程A正在waiting 从SynchronousQueue取一个元素,此时offer(e),则e会被A接走,offer返回true;假设没有线程正在waiting从SynchronousQueue取一个元素,此时offer(e),则offer(e)不会阻塞当前的线程,会马上返回,且返回false。offer特点是如果没有线程在waiting从SynchronousQueue取元素,则offer(e)不会阻塞当前线程。

   JDK的ThreadPoolExecutor的execute方法代码如下(如果不理解,建议先看下JDK中ThreadPoolExecutor的源码,理解工作原理)。如果提交的Runnable执行耗时较长,那么多数情况下没有waiting to receive的线程,所以图1中第二个红框处的workQueue.offer(command) 会马上返回false,所以会进入第三个红框处,即在线程池中新增线程。这就是为什么如果我们提交的Runnable执行耗时较长,则会出现很多的线程,如图2所示。

                                    图1 JDK中ThreadPoolExecutor的execute(...)源码

                            图2 设置每个Runnable中睡眠700毫秒,则线程池创建了10个线程

    使用场景:JDK的注释上说,用于short-lived task,这中线程池我在很多源码中看见过。

    缺点:线程池中会出现大量的线程。

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/06/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.CachedThreadPool
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档