【问题标题】:Organize threads in groups and set a different max threads to each group按组组织线程并为每个组设置不同的最大线程数
【发布时间】:2011-08-07 08:52:49
【问题描述】:

我正在使用 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 定义的线程数

有没有可能以简单的方式做到这一点?

谢谢

【问题讨论】:

    标签: java spring threadpool


    【解决方案1】:

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

    这种技术唯一的小缺点是,一旦工作任务开始,在所有子任务完成之前它们不会屈服。如果您有公平的使用政策并希望避免饥饿,这可能会很糟糕。

    【讨论】:

      猜你喜欢
      • 2015-05-07
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多