JavaのThread.sleep()メソッドとは?使い方と例外処理を徹底解説
sleep()メソッドはThreadクラスのstatic(静的)メソッドであり、指定した時間だけ現在実行中のスレッドを一時停止(スリープ)させるために使用します。スレッドが他のスレッドから割り込みを受けるとInterruptedExceptionがスローされるため、Thread.sleep()は必ずtry-catchブロック内に記述するか、throws句で宣言しなければなりません。
Thread.sleep()を呼び出すと、内部でスレッドスケジューラと連携し、現在のスレッドを一定時間「待機状態」に遷移させます。そして待機時間が経過すると、スレッドは待機状態から「実行可能状態(RUNNABLE)」へと移行し、再びCPUの割り当てを待つようになります。
構文
public static void sleep(long milliseconds) public static void sleep(long milliseconds, int nanoseconds)
sleep(long milliseconds):指定したミリ秒だけスレッドをスリープさせます。
sleep(long milliseconds, int nanoseconds):ミリ秒にナノ秒を加えた、より精密な時間を指定してスレッドをスリープさせます。
コード例
class UserThread extends Thread {
public void run() {
for(int i=1; i <= 5; i++) {
System.out.println("User Thread");
try {
Thread.sleep(1000); // スレッドを1秒間停止させる
} catch(InterruptedException e) {
System.out.println("例外が発生しました: " + e);
}
}
}
}
public class SleepMethodTest {
public static void main(String args[]) {
UserThread ut = new UserThread();
ut.start(); // スレッドを開始する
}
}
実行結果
User Thread User Thread User Thread User Thread User Thread
この例では、run()メソッド内のループで1回の出力ごとにThread.sleep(1000)を呼び出しているため、「User Thread」という文字列が約1秒間隔で5回表示されます。
sleep()使用時の注意点
sleep()メソッドには以下の特徴があるため、マルチスレッドプログラミングでは注意が必要です。
- sleep()はstaticメソッドであるため、常に「現在実行中のスレッド」に対して作用します。特定の別スレッドを直接停止させることはできません。
- sleep()中でも、そのスレッドが保持しているロック(モニター)は解放されません。これはwait()メソッドとの大きな違いです。
- 待機中に他のスレッドからinterrupt()されるとInterruptedExceptionが発生するため、適切な例外処理が必須です。
-
JavaのSwingWorkerクラスとは?GUIアプリで非同期処理を行う重要性と使い方を解説
SwingWorkerクラスは、時間のかかる処理(長時間実行タスク)などをワーカースレッド上で非同期に実行し、その結果に基づいてイベントディスパッチスレッド(EDT)からSwingコンポーネントを安全に更新するための仕組みを提供します。このクラスはJava 1.6で導入されました。Swingでは、すべてのUI更新はEDT上で行う必要があります。しかし、EDT上で重い処理を直接実行すると画面がフリーズしてしまい、ユーザー体験を大きく損ないます。SwingWorkerを使えば、バックグラウンドでの処理とUIの更新を適切に分離できるため、応答性の高いデスクトップアプリケーションを実現できます。Swi
-
JavaのSwingUtilitiesクラスとは?invokeAndWait()とinvokeLater()で実現するスレッドセーフなGUI操作
JavaのSwingでは、コンポーネントが画面に表示された後、それらを操作できるのは「イベントディスパッチスレッド(Event Handling Thread)」と呼ばれる単一のスレッドだけです。これはSwingの重要な設計原則であり、複数のスレッドから同時にGUIを操作すると不整合や予期しない動作が発生するため、すべての描画・更新処理をこのスレッドに集約することで安全性を確保しています。開発者は、別途作成したコードブロックの参照をイベントディスパッチスレッドに渡すことができます。SwingUtilitiesクラスには、そのための2つの重要なstaticメソッド、invokeAndWait()