Java的线程池,如何设定保留的最小线程数和固定的队列容量?
伊谢尔伦
伊谢尔伦 2017-04-18 09:44:24
[Java讨论组]

我希望线程池里面的线程能够在4 - 16之间浮动,队列容量为256。我写了下面这样的代码:

ThreadPoolExecutor tExecutor = new ThreadPoolExecutor(16, 16, 60L, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(256));
tExecutor.allowCoreThreadTimeOut(true);

其他条件都符合要求,但是这里只能在0 - 16之间浮动。

如果这样写:

ThreadPoolExecutor tExecutor = new ThreadPoolExecutor(4, 16, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
        tExecutor.allowCoreThreadTimeOut(false);

可以在4 - 16之间浮动,但是队列不能存储数据。

我该怎样设定参数,达到目的呢?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(2)
巴扎黑

1.队列不能存储数据时因为SynchronousQueue的问题,它是一种阻塞队列,其中每个插入操作必须等待另一个线程的对应移除操作 ,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有,所以它存储不了数据;

2.线程池的处理是这样的:

  1. 来了一个新任务后,先检查当前线程池的线程数有没有达到corePoolSize,如果没有,则new一个线程出来处理新任务;

  2. 如果当前线程数已经达到了corePoolSize,则将新任务放到队列中;

  3. 如果队列已经满了,则开始new新线程去处理,直到达到maximumPoolSize

黄舟

这样写不行吗?

ThreadPoolExecutor tExecutor = new ThreadPoolExecutor(4, 16, 60L, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(256));
tExecutor.allowCoreThreadTimeOut(false);

coreThreadTimeOut一定要是false的,你第一种是true肯定不行,空闲的core thread会被干掉

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号