我正在创建“大线程”,让我们将它们命名为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.");
}
答案 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()