解散して2つのブロックに分かれることをお勧めし[do level 1]
ます[do level 2]
。
何かのようなもの
...
for(int i=0; i< 10; i++)
{
new Thread(){
public void run(){
<do something level 1>
}
}.start;
}
**join**
for(int i=0; i< 10; i++)
{
new Thread(){
public void run(){
<do something level 2>
}
}.start;
}
<do something level 3>
...
wait
\notify
メインスレッドのカウンターで作業するのではなく。私はそれらに慣れていないからかもしれませんが、それは物事を不必要に複雑にし、ほぼ確実に競合状態に陥ると思います.
さらに、s を使用するのExecutorService
ではなく、抽象化を使用することをお勧めしますThread
。最下位レベルで作業する必要がなくなり、多くの設定が可能で強力です。それらに慣れると、理解するのもずっと簡単です。
ExecutorService service = Executors.newFixedThreadPool(10);
for (int i = 1; i <= 10; i++) {
final int w = i;
service.execute(new Runnable() {
public void run() {
long wait = (long) (Math.random() * 1000);
try {
Thread.sleep(wait);
} catch (InterruptedException e) {
}
System.out.println(w + "LEVEL 1 done " + wait);
}
});
}
service.shutdown();
service.awaitTermination(1, TimeUnit.DAYS);
System.out.println("all level 1 done");
service = Executors.newFixedThreadPool(10);
for (int i = 1; i <= 10; i++) {
final int w = i;
service.execute(new Runnable() {
public void run() {
long wait = (long) (Math.random() * 1000);
try {
Thread.sleep(wait);
} catch (InterruptedException e) {
}
System.out.println(w + "LEVEL 2 done " + wait);
}
});
}
service.shutdown();
service.awaitTermination(1, TimeUnit.DAYS);
System.out.println("all done");