微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决分组组织线程,并为每个组设置不同的最大线程

| 我正在使用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”,该组将您的组名映射到具有最大线程数限制的特定执行程序。这不能满足您总体上拥有最大线程数的要求,但是我认为这一要求可能是不合理的,因为您永远无法完全控制Java应用程序中运行的线程数。 第二种方法虽然更复杂,但是却提供了更多控制权。您可以有一个最大池大小的执行程序,而不是直接向其提交作业,而是提交工作程序任务,该任务将2的实际任务进行处理,直到没有剩余为止。您提交的工作程序任务数将等于组线程限制。伪代码可能如下所示:
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();
            }
        }
    });
}
这种技术的唯一轻微缺点是,一旦工作程序任务开始,它们将不会屈服,直到所有子任务完成。如果您有合理的使用政策并希望避免饥饿,这可能会很糟糕。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。