对并行线程组执行顺序操作



我有以下场景需要尽快更改:
1.一组顺序线程执行(包含3个线程(
2.执行另一组顺序线程(包含2个线程(
3.一组并行线程执行(包含9个线程,以便正确应用线程的生产者-消费者方法(

我为什么创建这个场景

为了首先执行特定的线程(第1点:包含3个线程(,在它们的处理完成后,我需要执行另外2个线程(第2点:包含2个线程(。如果并且仅当覆盖了1点和2点时,我需要处理第3点。

最初,我需要执行所有线程来处理并行操作,但我放弃了这个想法,因为并行线程将同时执行。

对于上述情况,一切都很顺利,直到出现一些问题

为什么我需要更改上述场景

有时,我会得到一个异常,在并行线程的情况下可以很好地处理它。而如果我进入无法处理的Sequential线程,则会出现相同的异常。由于,顺序线程的所有其他处理都处于等待状态,直到第一个处理完成。


因此,我需要利用并行线程的优势,但我选择这种方式是为了简单,这已经成为应用程序难以处理的情况
因此,我需要创建这样一个场景,在该场景中,我应该以固定的顺序执行不同的并行线程。例如:

Order-1st=处理前3个并行线程
Order-2nd=处理接下来的2个并行线程
Order-3rd=处理下一个9个平行螺纹

此外,上述情况也有一定的局限性,尽管我需要一个通用的解决方案。比如,如果将来我想从Order-1中再添加2个线程,或者,如果我甚至为任何顺序删除一些线程,那么组的序列应该根据需要执行。
在java中,有没有任何方法可以让我们创建一组并行线程,以便它们可以按照我们指定的任何顺序执行?

编辑
如果你能帮我修改,我有以下代码片段:

//一级

Thread[] threads = new Thread[list1.size()];
int j=0;
for(list1.size()){
    Object delegator1 = new Object("Level-1");
    Thread th = new Thread(delegator1);
    threads[j]=th;
    th.start();
    j++;
}
for(Thread thread: threads){
    thread.join();
}

//二级

threads = new Thread[list2.size()];
j=0;
for(list2.size()){
    Object delegator2 = new Object("Level-2");
    Thread th = new Thread(delegator2);
    threads[j]=th;
    th.start();
    j++;
}
for(Thread thread: threads){
    thread.join();
}

//三级&4-->应用生产者消费者使用等待通知工作正常

for(list3.size()){
    Object delegator3 = new Object("Level-3 & 4")
    Thread th = new Thread(delegator3);
    th.start();
}

我希望这些不同的级别并行执行,但如果第一个级别结束,第二个级别应该随后执行。

因此,您的订单实例似乎有一些状态。状态为Order-1Order-2Order-3Failed

您可以使用生产者-消费者队列来实现这些状态(甚至可以使用一个队列来实现所有状态(。根据您的操作结果,实例会移动到"下一个"队列,该队列由您需要的线程数量处理。

当使用单个队列时,处理它的一种可能方式可以是包含计算的信封对象,如

class Order1Processor implements Runnable {
     Object delegate;
     Order1Processor(Object delegate) { this.delegate = delegate; }
     public void run() { 
       try {
          // do the Order-1st processing
          doSomethingWith(delegate);
          // submit to next free Thread for Order-2nd processing
          submitToQueue(new Order2Processor(delegate));
       } catch (Throwable t) {
          // signal/handle failure
          submitToQueue(new FailedProcessor(delegate, t))
       }
 }

}  
class Order2Processor .. 

现在,您可以使用任意数量的线程来处理订单。单个队列允许您根据当前要做的工作自动分配所需的资源。如果您有一些订单或操作需要提前处理或按特定顺序处理,您甚至可以使用PriorityQueue。

如果您只想等待一组线程完成,您可以在主线程中使用CountDownLatch,初始化为线程数量。然后,主线程等待每个线程完成并通知锁存器。

对下一组重复此操作。

这最终解决了我的问题。

相关内容

最新更新