多线程 - 在创建新线程之前等待子线程 - Java

时间:2016-08-04 11:57:51

标签: java multithreading

我正在创建“大线程”,让我们将它们命名为A,B,C ......并将它们放入队列中。 这些“大线程”中的每一个都在其中创建子线程。 a1,a2,a3,b1,b2,b3,c1,c2,c3 ...

我所做的是检查A是否已终止,然后启动B,依此类推。但是当A完成a1,a2,a3同时启动并运行时,A成为TERMINATED。因此B在b1,b2,b3之后立即开始。我不希望这种情况发生。如何检查或使A等待a1,a2,b3然后被终止?

我对代码进行了简化和匿名化,但基本思路是一样的:

这里是创建runnable foo类并将其添加到队列FYI:

的地方
RunnableFooClass rc = new RunnableFooClass();
Thread t = new Thread(rc);

这是在runnable foo类(“大线程”)中创建的runnable bar类(“子线程”)的run方法

@Override
public void run() {
    for(int i=0; i<Constants.THREAD_NUM; i++){
         //initialize t
         t.start
    }
}

以下代码处于无限循环中:

if(jobQueue.peek().getState() == Thread.State.TERMINATED){
    try {
        jobQueue.peek().join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(jobQueue.poll().getName() + "end.");
}
if(jobQueue.peek() != null){
    jobQueue.peek().start();
    System.out.println(jobQueue.peek().getName() + "start.");
}

1 个答案:

答案 0 :(得分:2)

基本解决方案是使用Set rFound = ActiveSheet.Cells.Find(What:=strERROR, After:=Range("A1"), Lookat:=xlPart,LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)

在线程A中创建一个初始化CountDownLatch的锁存器并将其传递给每个子线程:

THREAD_NUM

然后,在子线程@Override public void run() { CountDownLatch latchA = new CountDownLatch(Constants.THREAD_NUM); for(int i=0; i<Constants.THREAD_NUM; i++){ RunnableFooClass rc = new RunnableFooClass(latchA); Thread t = new Thread(rc); t.start(); } latchA.await(); // wait for termination of all subthreads }

的最后
run()
相关问题