Threadインスタンスのjoin()メソッドを使用して、スレッドの実行の開始を別のスレッドの実行の終了に「結合」して、別のスレッドが終了するまでスレッドが実行を開始しないようにすることができます。join()がThreadインスタンスで呼び出されると、現在実行中のスレッドは、Threadインスタンスの実行が完了するまでブロックされます
しかし、iaに複数のスレッドがあり、ループの内側でjoinを呼び出す場合。すべてのスレッドが並行して実行されます。しかし、結合の概念によれば、最初に結合されたスレッドは終了し、次にメインスレッドのみが他のスレッドに結合できるようにする必要があります。
public class MultiThreading implements Runnable {
private int name;
public MultiThreading(int number) {
name =number;
}
@Override
public void run() {
for (int i = 0; i <= 10; i++ ) {
System.out.println("Thread number :" + name +" Printed value "+i);
try {
Thread.sleep(100);
} catch (final InterruptedException e) {
return;
}
}
}
public static void main(String[] args) throws InterruptedException {
final Thread[] workers = new Thread[3];
for (int i = 0; i < nthreads; ++i) {
workers[i] = new Thread(new MultiThreading(i));
}
for (final Thread t : workers) {
t.start();
}
for (final Thread t : workers) {
t.join();
System.out.println("Thread joind to main thread : " + t.getName());
}
System.out.println("Main thread ends");
}
}
上記のコードでは、最初のスレッドが結合された場合、メインスレッドはブロックされ、他のスレッドを結合させてはなりません(結合されたスレッドがrunメソッドの実行を完了するまで)。しかし、すべてのスレッドは並列に結合されます。出力は次のようになります-
Thread number :0 Printed value 0
Thread number :1 Printed value 0
Thread number :2 Printed value 0
Thread number :0 Printed value 1
Thread number :1 Printed value 1
Thread number :2 Printed value 1
Thread number :0 Printed value 2
Thread number :1 Printed value 2
Thread number :2 Printed value 2
Thread number :0 Printed value 3
Thread number :1 Printed value 3
Thread number :2 Printed value 3
Thread number :0 Printed value 4
Thread number :1 Printed value 4
Thread number :2 Printed value 4
Thread number :1 Printed value 5
Thread number :0 Printed value 5
Thread number :2 Printed value 5
Thread number :0 Printed value 6
Thread number :1 Printed value 6
Thread number :2 Printed value 6
Thread number :1 Printed value 7
Thread number :0 Printed value 7
Thread number :2 Printed value 7
Thread number :0 Printed value 8
Thread number :1 Printed value 8
Thread number :2 Printed value 8
Thread number :1 Printed value 9
Thread number :0 Printed value 9
Thread number :2 Printed value 9
Thread number :1 Printed value 10
Thread number :0 Printed value 10
Thread number :2 Printed value 10
Thread joind to main thread : Thread-0
Thread joind to main thread : Thread-1
Thread joind to main thread : Thread-2
Main thread ends
まず第一に:
Threadインスタンスのjoin()メソッドを使用して、スレッドの実行の開始を別のスレッドの実行の終了に「結合」できます。
これは誤解です。これはスレッドの開始とは関係ありません。結合はこれのみを行います。実行中のスレッドは、他のスレッドが終了するまで待機します。
あなたが行うとsomeThread.join()
someThreadが終了するまで、そのメソッドを呼び出すスレッドが待っています!
しかし、すべてのスレッドは並列に結合されます。
はい、すべて完了しました。
スレッドはすべてまったく同じことを行うので、ここまたはそこに数ナノ秒(System.outへの書き込みがとにかく効果的に同期するという事実のためにほとんど無効にされる)に加えて、すべて同じ時間を必要とします。
したがって、最初のスレッドに参加するまでに、他の2つのスレッドは完了します。したがって、への最初の呼び出しでjoin()
は、「メイン」スレッドは最初のスレッドが終了するまで待機します。これらのスレッドも完了しているため、後続の呼び出しは「即座に」発生します。
物事を遅らせるには、ループの数をMultiThreading
クラスのパラメーターにして、スレッドが異なる時間を必要とすることを確認します。スレッド0が10ループを実行し、スレッド1が20を実行し、スレッド2が30を実行する場合、各結合は対応するスレッドの終了を実際に待機していることがわかります。
長い話を短く:あなたが開始するので、彼らはすぐに並行して実行を開始し、すぐにすべてのあなたのスレッドを。その後のjoin呼び出しは、各ワーカースレッドが終了するまで、メインスレッドの進行を遅らせるだけです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加