スレッド結合が論理を順次実行するので、最初に複数のスレッド間でタスクを分割する動機は何ですか?つまり、実際にスレッド結合が必要な実際のシナリオを思いつくことはできません。スレッド結合()は、スレッドと同時実行性の唯一の目的を破ったときに便利です
答えて
複数のスレッドを起動する場合は、join()
を使用して、すべてが完了するまで待つことができます。
たとえば、5つの作業項目をそれぞれ独自のスレッドで起動し、5スレッドでjoin()
を呼び出すと、5つの項目をすべて同時に処理できますが、すべて完了するまでブロックされます。
しかし、多くの言語/フレームワークではスレッドを明示的に結合するよりも優れた選択肢があることに注意してください。たとえば、.NETの世界では、TPLを使用すると、1つまたは複数のタスク(必要に応じてスレッドにマッピングできる)がすべて完了したときに発生する継続をスケジュールできます。
+1 'thread.join()'のもう1つの重要な機能はメモリ同期です。成功する 'join()'を呼び出すスレッドは、私が知っているより多くのスレッドパッケージと共に、それが結合したスレッドによって行われたメモリ更新を見ます。 – Gray
いくつかの状況では、同様のタスクを一連のスレッドに渡すことがありますが、探している「回答」を得るためにはすべてのスレッドを完了する必要があります。
たとえば、チェスゲームを作っていたら、個々のスレッドに潜在的な動きのセットを渡して、それらがすべて終了するまで待ってから「ベスト」を選択することができます。
多くの場合、並行して実行することが必要な場合があります。すべて完了したら、結果をすべて組み合わせて前進したいと思うことがあります。
たとえば、サーバー側で多数の独立したウィジェットのデータをロードする必要があるWebポータルのホームページを取り上げます。それらのデータロードを並行して起動し、メインページをレンダリングする前にそれらのページにメインスレッドを参加させる(つまり、完了するのを待つ)ことができます。
これは、人間に知られている他のスレッド間通信メカニズムよりも多くの弱点を持っているため、有用ではありません。オーバーヘッドを高め、プロセスのシャットダウンを防ぐ可能性が高い、貧弱なマルチスレッド設計を積極的に推進します。 GUIアプリケーションで。
使用を避けることができます。
私は合理的に複雑なアプリケーションであるJettyでjoin()を使う完全に合理的なコードを見てきたので私はダウン投票しました。シャットダウン時にスレッドプール内のスレッドが終了するまで待機するために使用されました。 java.util.concurrentには現在より優れたオプションがありますが、これは古いバージョンのJavaをサポートしたい場合には役に立ちません。 –
私は、Join()、TThread.WaitForなどを使用して開発者を様々な言語で停止しようと30年以上努力しました。私の見解は変わりません。 –
あなたを説得しようとしていません(実際には、ほとんどの場合、より良い選択肢があることに同意します)。ただ投票を説明するだけです。 –
私も。 Join()は、threadpoolsやapp-lifetimeスレッドを使用する代わりに、スレッドを継続的に作成/終了/破棄するための招待であるため、作成などのオーバーヘッドに時間とCPUを浪費します。 Join()は、終了時にデッドロックするGUIアプリケーションにも適しているので、プロセスの終了を防ぐことができます。おそらく、最悪のスレッド間通信が存在する可能性があります。 –