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 を使用して非常に簡単に実装できます。