問題の歴史:
Javaでは、マルチスレッドのサポートは初めから実装されています。スレッドは、複数のタスクを並行して実行し、マルチコアプロセッサを効率的に活用できるようにします。JVMはオペレーティングシステムのスレッドに対して抽象化のレイヤーを提供します。
問題:
スレッドの作成、管理、終了には、ライフサイクル、同期、および潜在的なレース状態に関する明確な理解が必要です。スレッドを不注意に使用すると、デッドロック、不正なリソースアクセス、複雑なエラーログにつながる可能性があります。
解決策:
Javaでは、Threadクラスの拡張やRunnableインターフェースの実装、またはExecutorServiceのような最新の手段を使用してスレッドを作成できます。スレッドを正しく終了し、ライフサイクルを管理し、共有データへのアクセスを同期させることが重要です。
スレッドの作成と終了の例:
class MyRunnable implements Runnable { public void run() { System.out.println("スレッドが実行中"); } } public class ThreadExample { public static void main(String[] args) { Thread t = new Thread(new MyRunnable()); t.start(); // スレッドを開始 try { t.join(); // 終了を待機 } catch (InterruptedException e) { e.printStackTrace(); } } }
主な特徴:
start()メソッドを使用して開始しなければならず、run()を使用してはいけません(そうしないと実際の並行性は得られません)。join()を使用することが重要です。startはIllegalThreadStateExceptionをスローします。終了後にスレッドを再起動できますか?
いいえ。終了した後、スレッドは「死んでいる」と見なされ、再度start()を呼び出すとIllegalThreadStateExceptionが発生します。
t.run()とt.start()の違いは何ですか?
t.run()は現在のスレッドでrunメソッドを呼び出し、新しい実行スレッドを作成しません。t.start()のみがOSの別のスレッドを作成します。
スレッドが未処理の例外で終了した場合、どうなりますか?
未処理の例外がスローされると、スレッドは異常終了し、そのスタックトレースがエラーストリームに出力され、他のスレッドには影響を及ぼしません。
start()の代わりにrun()を呼び出すInterruptedExceptionの処理を行わない)プログラマーがrun()メソッドを使用してスレッドを開始し、メインと並行して動作することを期待しますが、実際にはすべてが逐次的に実行されます。
利点:
欠点:
start()を正しく使用し、例外を適切に処理し、スレッドの終了を待つためにjoin()を使用します。
利点:
欠点: