【问题标题】:How to create separate thread pool that uses master thread pool如何创建使用主线程池的单独线程池
【发布时间】:2015-03-28 12:09:22
【问题描述】:

我正在使用springThreadPoolExecutorFactoryBean。它是一个主线程池。在某些情况下,我需要创建 CompletionService 它确保我按照完成顺序获得线程。

我的代码sn-p:

ExecutorService pool = Executors.newFixedThreadPool(list.size());

CompletionService<T> completionService = new ExecutorCompletionService<T>(pool);

问题是我不想在这里创建固定线程池而是使用主线程轮询,只是为了避免创建太多线程。

我当然不能将主线程池传递给完成服务,因为当我从完成服务completionService.take() 获取价值时,我会得到完全不相关的线程。

也许您可以帮我找到一种方法,如何从主线程池创建某种固定线程池并将其传递给完成服务。

非常感谢

【问题讨论】:

  • 也许您需要创建一个自定义ExecutorService,它有一个线程池,以及用于不同任务类别的不同队列。它不必是一个完全自定义的对象,它可能只是一个在 ThreadPoolExecutor 之上分层一些额外智能的包装器。

标签: java multithreading spring concurrency threadpool


【解决方案1】:

这里有误会。 CompletionService 简单地接收任务,异步执行它们并按照任务完成的顺序提供结果。 CompletionService#take() 返回提交任务的结果,而不是线程。

ExecutorCompletionService 将任务执行委托给Executor,它可以很好地执行从其他来源提交的任务。所以按照您的代码示例显示的内容应该没有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2011-05-04
    • 2023-02-02
    • 2014-04-25
    • 2020-01-06
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多