ThreadPoolExecutor - 在队列之前使用线程

时间:2013-10-09 06:16:50

标签: java threadpoolexecutor

我正在用给定的ThreadPoolExecutor替换旧的线程池。在传统线程池中,启动时会创建600个线程。但是在ThreadPoolExecutor中,使用核心线程,max threads和prestartAllCoreThreads()的概念,可以限制启动时的线程数。

现在,

1)如果运行的corePoolSize线程少于corePoolSize线程,则Executor总是更喜欢添加新线程而不是排队。 2)如果corePoolSize或更多线程正在运行,则Executor总是更喜欢排队请求而不是添加新线程。 3)如果请求不能排队,则创建一个新线程,除非它超过maximumPoolSize,在这种情况下,该任务将被拒绝。

第一种情况是可以的,但我想要的是,当使用核心线程时,而不是排队的任务(即使在有界队列的情况下,比如大小为100)并等待核心线程空闲或排队到如果已满,则从非核心池配额创建新线程。与实时一样,我的应用程序无法忍受队列中任务等待的想法。

所以我想要的是CoreThreads - >非CoreThreads - >队列而不是CoreThreads - >队列 - >非CoreThreads。

即如果正在使用核心线程,则创建新线程,如果池大小最大,则任务应该进入队列并等待任何线程空闲。

现在,一种方法是扩展ThreadPoolExecutor类并覆盖execute方法,但是我必须几乎复制完整的类。这是我能想到的肮脏方式。任何人都可以建议任何其他方式。

注意:我不能使用cachedThreadPool,因为需要限制线程数。

1 个答案:

答案 0 :(得分:2)

我在这里看到的设计问题多于线程包问题。

使用线程来减少延迟或增加吞吐量。鉴于您正在创建600个线程,这更多是在服务器上增加吞吐量的情况。但是,任何现代服务器都没有600个CPU内核,您将受到上下文切换的严重影响。在一组队列中使用固定数量的线程是简单而有效的。

如果你真的认为你的情况是合理的,那么只需创建自己的接口包装标准线程池,并在单独的线程上启动时有一些自定义逻辑。但是,我真的怀疑这会增加你的系统性能。

基本上,除非真的,非常合理,否则我不认为创建新线程比在实时系统中排队更好。