java - 将线程分组并为每个组设置不同的最大线程数

标签 java spring threadpool

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

例如,像这样:

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

不知何故,threadPoolTask​​Executor 应该知道只允许每个名为 myTask.getGroupName() 的组使用 myTask.getMaxThreads(),并且所有任务中的最大线程总数不应超过 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();
            }
        }
    });
}

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

关于java - 将线程分组并为每个组设置不同的最大线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5694659/

相关文章:

java - 在 Ajax 行为中获取单选按钮选择值

java - 在maven项目的命令行运行jar文件

c# - ThreadPool SetMaxThreads 和 SetMinThreads 魔数(Magic Number)

java - 了解链式 CompletableFuture 的并行执行

C# 线程读写文件

java - 从 JSP 页面上的 ServletContext 获取属性

java - 如何从字符串创建 Java 内置对象

java - Spring MVC 和错误 400 : SRVE0295E

java - 从 JSON 解析 Map 和 String 不起作用

java - 设置参数时出现问题