0

マルチスレッドについていくつか問題があります。私のプログラムは以下の通りです:

...
for(int i=0; i< 10; i++)
{
   new Thread(){
       @Overried
       public void run(){
           <do something level 1>

           <do something level 2>
       }
   }.start;
}
<do something level 3>
...

10 個のスレッドがすべて終了した後、メイン スレッドのみが [レベル 3 を実行] を実行することを願っています [レベル 2 を実行]。そして、すべての子スレッドが終了したイベント [do something level 1] が発生する前に、スレッドを実行 [do something level 2] させないでください。

4

2 に答える 2

3

それらを呼び出すために、開始したスレッドへの参照を保持する必要がありjoinます。

最初のことを達成するには、次のことができます。

Thread[] threads = new Thread[10];
for(int i=0; i< 10; i++)
{
   threads[i] = new Thread(){
       // ...
   };
   threads[i].start();
}
for(int i=0; i< 10; i++)
{
   threads[i].join();
}

2 番目のスレッドについては、おそらくwaitメイン スレッドとnotify子スレッドで (タスク 1 の終了後) を使用して最初の部分の終了を通知し、wait次に子スレッドとnotifyAllメイン スレッドですべてのスレッドが最初に完了したことを通知する必要があります。部。

于 2012-10-20T03:15:50.810 に答える
0

解散して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");
于 2012-10-20T04:33:39.717 に答える