joinがメインスレッドをブロックするのに、ループでブロックしないのはなぜですか?

アンシュルカブラ:

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
GhostCat:

まず第一に:

Threadインスタンスのjoin()メソッドを使用して、スレッドの実行の開始を別のスレッドの実行の終了に「結合」できます。

これは誤解です。これはスレッドの開始とは関係ありません結合はこれのみを行います。実行中のスレッドは、他のスレッドが終了するまで待機します。

あなたが行うとsomeThread.join()someThreadが終了するまで、そのメソッドを呼び出すスレッドが待っています!

しかし、すべてのスレッドは並列に結合されます。

はい、すべて完了しました。

スレッドはすべてまったく同じことを行うので、ここまたはそこに数ナノ秒(System.outへの書き込みがとにかく効果的に同期するという事実のためにほとんど無効にされる)に加えて、すべて同じ時間を必要とします。

したがって、最初のスレッドに参加するまでに、他の2つのスレッドは完了します。したがって、への最初の呼び出しでjoin()は、「メイン」スレッドは最初のスレッドが終了するまで待機します。これらのスレッドも完了しているため、後続の呼び出しは「即座に」発生します。

物事を遅らせるには、ループの数をMultiThreadingクラスのパラメーターにして、スレッドが異なる時間を必要とすることを確認します。スレッド0が10ループを実行し、スレッド1が20を実行し、スレッド2が30を実行する場合、各結合は対応するスレッドの終了を実際に待機していることがわかります。

長い話を短く:あなたが開始するので、彼らはすぐに並行して実行を開始し、すぐにすべてのあなたのスレッドを。その後のjoin呼び出しは、各ワーカースレッドが終了するまでメインスレッドの進行を遅らせるだけです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

QTimer :: singleShotが時間1でメインスレッドをブロックするのに、0ではブロックしないのはなぜですか

分類Dev

Futureがメインスレッドをブロックしているのはなぜですか?

分類Dev

常にアニメーション化されているUIActivityIndicatorがメインスレッドをブロックしないのはなぜですか?

分類Dev

Handler.Postがメインスレッドをブロックするのはなぜですか

分類Dev

サーバーの作成後にC ++ httplibライブラリがメインスレッドをブロックするのはなぜですか?

分類Dev

Pythonスレッド。スレッドが互いにブロックしているのはなぜですか?

分類Dev

メインスレッドのLooper.loop()がUIスレッドをブロックしないのはなぜですか?

分類Dev

イベントループをブロックしてもcssアニメーションがブロックされないのはなぜですか?

分類Dev

このサブスクリプションがメインスレッドをブロックするのはなぜですか?

分類Dev

スレッドがJavaFXUIスレッドをブロックしているのはなぜですか?

分類Dev

Googleドライブのカールリクエストが通常、Google Chromeのドラッグアンドドロップアップロードよりもはるかに速いアップロード速度を経験するのはなぜですか?

分類Dev

なぜこのFutureのメソッドはメインスレッドをブロックしているのですか?

分類Dev

別のスレッドでスリープしているときに、ソケットの受信がブロックされるのはなぜですか?

分類Dev

nodejs fs sync同期APIが、ワーカープール(nodejsのデフォルト)で実行する必要があるときにメインスレッド(ループも)をブロックするのはなぜですか?

分類Dev

ドキュメントでは、BluetoothServerSocket.accept()がスレッドをブロックしているのに、whileループで呼び出されるのはなぜですか?

分類Dev

メソッドは「if」ブロックでのみ返されるのに、なぜコンパイルエラーがないのですか?

分類Dev

リアクティブプログラミング(Reactor):なぜメインスレッドがスタックしているのですか?

分類Dev

スレッドプールを使用しているときに、boost :: asyncブロックへのネストされた呼び出しがなぜですか?

分類Dev

このデーモンスレッドがブロックされているのはなぜですか?

分類Dev

1つのスレッドがCでブロックする場合、プロセス全体がブロックされないのはなぜですか

分類Dev

メソッド内にIIB(インスタンス初期化ブロック)を作成できますか?なぜコンパイル時エラーが発生しないのかわからない場合はどうすればよいですか?

分類Dev

GCD:2つのスレッドがメインスレッドで同時にブロックを実行したい場合はどうなりますか

分類Dev

ブロック内のアドレスの後にsedコマンドをグループ化できないのはなぜですか?

分類Dev

RunLoopがスレッド全体の実行をブロックしないのはなぜですか?

分類Dev

Qtシグナル/スロットブレークポイントがヒットしないのはなぜですか?(信号/スロット)

分類Dev

WindowsデスクトップがUDPをブロードキャストしないのはなぜですか?

分類Dev

whileループがイベントループをブロックするのはなぜですか?

分類Dev

sync.WaitGroupタイプのWait()メソッドがブロックし、非同期ではない場合、なぜそれを使用するのですか?

分類Dev

インラインブロックがフローティング要素をラップアラウンドしないのはなぜですか?

Related 関連記事

  1. 1

    QTimer :: singleShotが時間1でメインスレッドをブロックするのに、0ではブロックしないのはなぜですか

  2. 2

    Futureがメインスレッドをブロックしているのはなぜですか?

  3. 3

    常にアニメーション化されているUIActivityIndicatorがメインスレッドをブロックしないのはなぜですか?

  4. 4

    Handler.Postがメインスレッドをブロックするのはなぜですか

  5. 5

    サーバーの作成後にC ++ httplibライブラリがメインスレッドをブロックするのはなぜですか?

  6. 6

    Pythonスレッド。スレッドが互いにブロックしているのはなぜですか?

  7. 7

    メインスレッドのLooper.loop()がUIスレッドをブロックしないのはなぜですか?

  8. 8

    イベントループをブロックしてもcssアニメーションがブロックされないのはなぜですか?

  9. 9

    このサブスクリプションがメインスレッドをブロックするのはなぜですか?

  10. 10

    スレッドがJavaFXUIスレッドをブロックしているのはなぜですか?

  11. 11

    Googleドライブのカールリクエストが通常、Google Chromeのドラッグアンドドロップアップロードよりもはるかに速いアップロード速度を経験するのはなぜですか?

  12. 12

    なぜこのFutureのメソッドはメインスレッドをブロックしているのですか?

  13. 13

    別のスレッドでスリープしているときに、ソケットの受信がブロックされるのはなぜですか?

  14. 14

    nodejs fs sync同期APIが、ワーカープール(nodejsのデフォルト)で実行する必要があるときにメインスレッド(ループも)をブロックするのはなぜですか?

  15. 15

    ドキュメントでは、BluetoothServerSocket.accept()がスレッドをブロックしているのに、whileループで呼び出されるのはなぜですか?

  16. 16

    メソッドは「if」ブロックでのみ返されるのに、なぜコンパイルエラーがないのですか?

  17. 17

    リアクティブプログラミング(Reactor):なぜメインスレッドがスタックしているのですか?

  18. 18

    スレッドプールを使用しているときに、boost :: asyncブロックへのネストされた呼び出しがなぜですか?

  19. 19

    このデーモンスレッドがブロックされているのはなぜですか?

  20. 20

    1つのスレッドがCでブロックする場合、プロセス全体がブロックされないのはなぜですか

  21. 21

    メソッド内にIIB(インスタンス初期化ブロック)を作成できますか?なぜコンパイル時エラーが発生しないのかわからない場合はどうすればよいですか?

  22. 22

    GCD:2つのスレッドがメインスレッドで同時にブロックを実行したい場合はどうなりますか

  23. 23

    ブロック内のアドレスの後にsedコマンドをグループ化できないのはなぜですか?

  24. 24

    RunLoopがスレッド全体の実行をブロックしないのはなぜですか?

  25. 25

    Qtシグナル/スロットブレークポイントがヒットしないのはなぜですか?(信号/スロット)

  26. 26

    WindowsデスクトップがUDPをブロードキャストしないのはなぜですか?

  27. 27

    whileループがイベントループをブロックするのはなぜですか?

  28. 28

    sync.WaitGroupタイプのWait()メソッドがブロックし、非同期ではない場合、なぜそれを使用するのですか?

  29. 29

    インラインブロックがフローティング要素をラップアラウンドしないのはなぜですか?

ホットタグ

アーカイブ