组织线程并为每个组设置不同的最大线程

时间:2011-04-17 16:14:36

标签: java spring threadpool

我正在使用Spring ThreadPoolTask​​Executor来执行我的线程。 我想将我的线程分组在几个组中,并且每个组都有不同的最大允许线程。

例如,像这样:

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

不知何故,threadPoolTask​​Executor应该知道只允许myTask.getMaxThreads()到名为myTask.getGroupName()的每个组,并且所有任务中的最大线程都不应超过applicationContext.xml中为threadPoolTask​​Executor定义的内容

可以用简单的方式做到吗?

由于

1 个答案:

答案 0 :(得分:1)

我可以看到两种方法。第一种(也是更简单的)方法是创建一个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();
            }
        }
    });
}

这种技术唯一的缺点是,一旦工作任务启动,在所有子任务完成之前,它们不会产生。如果您有一个合理的使用政策并希望避免饥饿,这可能会很糟糕。