组织线程并为每个组设置不同的最大线程数
问题描述:
我正在使用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应用程序中运行的线程数量。
第二种方式,虽然比较复杂,但能给你更多的控制。您可以拥有一个最大池大小的执行程序,而不是直接向其提交作业,而是提交执行真实BlockingQueue
任务的工作任务,并处理它们,直到没有剩余任务。您提交的工作任务数量将等于组线程限制。伪代码可能是这样的:
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();
}
}
});
}
这种技术的只有轻微的缺点是一旦工人开始工作,他们不会屈服,直到所有的子任务完成。如果您有一个合理的使用政策并希望避免饥饿,这可能会很糟糕。