Spring boot 具有2个线程池、Java8和spring引导的循环模式

Spring boot 具有2个线程池、Java8和spring引导的循环模式,spring-boot,concurrency,java-8,Spring Boot,Concurrency,Java 8,问题陈述 我们有两个线程池。一个是主线程池A(由线程A1、A2、…An组成),另一个是辅助线程池B。线程池A中的每个线程都有一定数量的任务可以提交给线程池B。我希望有一个约束,即池A中的每个线程(比如A1)可以在任何给定时间点将N个任务提交到线程池B并正在进行中。如果提交到池B的任何任务完成,A1可以提交下一个任务,直到属于A1的所有任务完成 这背后的基本思想是为线程池a中的线程实现循环处理模式 我使用的是SpringBoot4和Java8 正在寻找实现此方案的最佳方法。感谢大家的帮助 我可以通

问题陈述

我们有两个线程池。一个是主线程池A(由线程A1、A2、…An组成),另一个是辅助线程池B。线程池A中的每个线程都有一定数量的任务可以提交给线程池B。我希望有一个约束,即池A中的每个线程(比如A1)可以在任何给定时间点将N个任务提交到线程池B并正在进行中。如果提交到池B的任何任务完成,A1可以提交下一个任务,直到属于A1的所有任务完成

这背后的基本思想是为线程池a中的线程实现循环处理模式

我使用的是SpringBoot4和Java8


正在寻找实现此方案的最佳方法。

感谢大家的帮助

我可以通过使用TokenCounter和Token helper类来解决这个问题。TokenCounter充当令牌的存储区,如果存储区中没有可用的令牌,它会要求调用线程等待,否则只返回令牌。另一方面,令牌总是知道它与哪个存储关联。因此,当我们将任务从池a提交到池B时,我们将传递一个令牌和任务。池B线程在执行分配的任务后释放令牌,该令牌将被提交回与其链接的令牌计数器,并且现在可用于所有等待的线程(如果有)。通过这种方式,我们可以限制池A中用于将任务提交到池B的每个任务的可用令牌数量

参考:


(我使用调度程序在一定时间后启动并提交池a中的任务)

。。。你试过什么?我对并发程序很陌生。因此,我首先研究了一些用于解决此类问题的流行类,如Countdownlatch和CyclicBarrier,但没有运气。然后我考虑编写一个自定义类,比如TokenCounter,它可以由池a中的每个线程使用,池a中的每个线程都有一些对象,比如可以使用方法getToken()访问的令牌池。如果池中没有可用的令牌,则要求调用线程等待,如果有令牌,则返回令牌。池B中的任务线程完成后,将令牌返回到令牌计数器。被标记池类型卡住了,不确定m r8A“线程池A中的线程”是否不能将任务提交到另一个线程池(除非您混淆了术语)。只有任务可以提交新任务,但当您将任务提交到线程池a时,您无法控制a的哪个线程将执行该任务,因此尝试根据a的线程限制向B提交任务是没有意义的。是的,您是对的。我的缺点是,我用线程代替任务。正如我提到的,池A的每个任务(假设A1)都包含一些固定数量的任务(假设1000)要提交给池B。我不需要知道A的哪个任务当前正在执行。我只希望A1最多向池B提交20个任务并等待。如果20个任务中的任何一个任务完成,则将第21个任务推送到池B。继续此操作,直到池B提交并执行了所有1000个任务。