0

Java のスレッドで遊んでいますが、join() メソッドについて質問があります。Thread を拡張する SampleClass があるとします。メインでいくつかの新しいスレッドをインスタンス化しますが、join() を使用してスレッドのジョブを順次完了させたいと考えています。

public static void main(String[] args) {
    for(int i=0; i<5; i++){
        new SampleClass().start();
    }
}

すぐに join() を呼び出すことは可能ですか? ...このようなもの:

new SampleClass().start().join();

または、使用する別のアプローチはありますか?...このように多分:

new SampleClass().start();
try{Thread.currentThread().join();}catch(InterruptedException e){...}

どうもありがとうございました

4

6 に答える 6

2

ポイントは何ですか?run() を呼び出すだけで、オーバーヘッドなしで同じ効果を得ることができます。

于 2013-07-14T23:08:04.673 に答える
2
new SampleClass().start().join(); This is wrong.

あなたは同様のことを達成することができます

   SampleClass samClass = new SampleClass();
   samClass.start();
   samClass.join()

上記のコードは、あなたが望んでいたのと同じ効果があります。

ここでの問題は、スレッドを順次実行することです。これらのケースのほとんどでは、スレッドを順次実行する必要はありません (ただし、いくつかのシナリオがあります)。あなたがしなければならないなら。

次に、このようにすることができます

   Thread t1 = ..
   Thread t2 = ..

   t1.start();
   t1.join();
   t2.start(); // t2 will start only when t1 dies
   t2.join(); //  
   t3.start(); // t3 will start only when t2 dies..

しかし、上記のアプローチは良くありません。他のスレッドを開始するには、前のスレッドを終了する必要があるためです。実際には、スレッドの作成はコストのかかる操作と考えて、再利用を試みる必要があります。

多くの場合、実際の問題は次のようなものです。タスク T1 、 T2 、 T3 、 T4 を順番に実行する必要がありますが、異なるスレッドで T1 && T3 をあるスレッドで実行し、 T2 と T4 を別のスレッドで実行する必要があります。したがって、ここでは 4 の代わりに 2 つのスレッドを使用できます。スレッド 1 は T1 を実行し、次にスレッド 2 は T2 を実行し、次にスレッド 1 は T3 を実行します。

Thread1 -> T1
Thread2 -> T2
Thread1 -> T3
Thread2 -> T4

すべてのタスクは順次実行されますが、2 つのスレッドのみを使用します。

以下のように問題を解決できます

  Thread1 ->run {
    while(canIrun) {
    executeTask(taskQueue1.next());
    notifyThread2();
    waitForThread2Signal();
   }
  }

  Thread2 -.run {
   while(canIrun) {
    waitForThread1Signal();
    executeTask(taskQueue2.next());
    notifyThread1();
   }
  }

待機および通知メソッドは、CyclicBarrier を使用して非常に簡単に実装できます。

于 2013-07-15T04:27:15.670 に答える
1

すぐに join() を呼び出すことは可能ですか?

いいえ、start()が返すものではありませんvoid。これらのメソッドをそのように連鎖させることはできません。そして、オブジェクトでjoin()を呼び出す必要がありThreadます。

于 2013-07-14T14:48:54.850 に答える
1

ExecutorService#submit(Runnable runnable).get()を使用できます

于 2013-07-14T14:50:17.163 に答える
0

インスタンス化されたスレッドは匿名である必要はありません。出来るよ:

public static void main(String[] args) {
    for(int i=0; i<5; i++){
        SampleClass sc = new SampleClass();
        sc.start();
        try {
            sc.join();
        } catch (InterruptedException e) {
        }
    }
}
于 2013-07-14T22:48:13.637 に答える