複数のスレッドでのスレッドの完了を確認する方法
複数のスレッドを同時に実行する場合、それらの完了ステータスを確認することが重要になります。この記事では、これを実現するためのさまざまな方法を検討します。
1. Thread.join(): Blocking Wait
Thread.join() メソッドを使用すると、特定のスレッドが実行を完了するまでメイン スレッドをブロックできます。このアプローチは単純ではありますが、アプリケーション全体の応答性を妨げる可能性があります。
2. Thread.isAlive(): ポーリング チェック
Thread.isAlive() は、スレッドがまだ実行中かどうかを定期的に確認します。ただし、このアプローチは非効率性とリソース消費の可能性があるため、一般的に推奨されません。
3. UncaughtExceptionHandler:
型破りなアプローチには、キャッチされない例外ハンドラーのセットアップが含まれます。スレッドが完了すると、例外をスローしてオブジェクト内のハンドラーをトリガーするようにプログラムできます。
4.ロックとシンクロナイザー:
ロックまたはシンクロナイザーを利用すると、スレッドの実行と完了を管理するためのより同期されたメカニズムを提供できます。
5.リスナーベースの通知:
より洗練されたソリューションには、リスナー インターフェイスを作成し、NotifyingThread を拡張するクラスを実装することが含まれます。これらのスレッドは完了時に自動的にリスナーに通知し、メイン スレッドが通知を受信してそれに応じて応答できるようにします。
リスナーベースの通知の実装:
このアプローチを実装するには、まず始めます。リスナー インターフェイスを定義します:
public interface ThreadCompleteListener { void notifyOfThreadComplete(final Thread thread); }
次に、抽象クラス NotifyingThread を作成します。スレッド:
public abstract class NotifyingThread extends Thread { private final Set<ThreadCompleteListener> listeners = new CopyOnWriteArraySet<>(); }
特定のスレッドでは run() の代わりに doRun() メソッドを実装する必要があります。完了すると、登録されているリスナーに通知します。
最後に、スレッドを開始するメイン クラスを変更して ThreadCompleteListener を実装します。各スレッドを作成したら、それをリスナー リストに追加します。
NotifyingThread thread1 = new OneOfYourThreads(); thread1.addListener(this); // Add main class as a listener thread1.start(); // Start the thread
スレッドが完了するかクラッシュするたびに、notifyOfThreadComplete メソッドが呼び出され、完了したスレッド インスタンスが提供されます。
注: 新しいスレッドを作成するには、一般に Thread を拡張するよりも Runnable を実装することが推奨されます。
以上が複数のスレッドの完了ステータスを効率的に判断するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。