在组中组织线程,并为每个组设置不同的最大线程数

  • 本文关键字:线程 设置 java spring threadpool
  • 更新时间 :
  • 英文 :


我使用Spring ThreadPoolTaskExecutor来执行我的线程。我想把我的线程分成几个组,每个组有不同的最大允许线程数。

例如:

for (MyTask myTask : myTaskList){
    threadPoolTaskExecutor.setMaxThreadsForGroup(myTask.getGroupName(), myTask.getMaxThreads());
    threadPoolTaskExecutor.execute(myTask, myTask.getGroupName());
}

threadPoolTaskExecutor应该知道只允许myTask.getMaxThreads()到每个名为myTask.getGroupName()的组,并且所有任务的最大线程数总和不应该超过applicationContext.xml中为threadPoolTaskExecutor定义的线程数

有可能用简单的方法来做吗?

谢谢

我可以看到两种方法。第一种(也是更简单的)方法是创建一个Map<String, ExecutorService>,它将您的组名映射到具有最大线程限制的特定执行器。这不能满足您对线程总数的最大要求,但我认为这个要求可能是不合理的,因为无论如何,您永远无法完全控制Java应用程序中运行的线程数。

第二种方法虽然更复杂,但给了你更多的控制。您可以使用一个具有最大池大小的单个执行器,而不是直接向它提交作业,而是提交工作任务,这些工作任务占用BlockingQueuereal任务并处理它们,直到没有剩余为止。提交的工作任务数量将等于组线程限制。伪代码可能看起来像这样:

ExecutorService executor = ...
int groupThreadLimit = 3;
final BlockingQueue<Runnable> groupTaskQueue = ...;
// Add all your tasks to the groupTaskQueue.
for(int i = 0; i < groupThreadLimit; i++) {
    executor.execute(new Runnable() {
        public void run() {
            while(true) {
                Runnable r = groupTaskQueue.pollFirst();
                if(r == null) {
                    return; // All tasks complete or being processed. Queue empty.
                }
                r.run();
            }
        }
    });
}

这种技术唯一的缺点是,一旦工作任务开始,它们将不会产生,直到所有的子任务完成。如果您有一个公平的使用策略并希望避免饥饿,那么这可能很糟糕。

相关内容

  • 没有找到相关文章

最新更新