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

问题描述:

我正在使用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定义的内容

是否可以以简单的方式执行?

感谢

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

这种技术的只有轻微的缺点是一旦工人开始工作,他们不会屈服,直到所有的子任务完成。如果您有一个合理的使用政策并希望避免饥饿,这可能会很糟糕。