Thread.sleep
現在実行中のスレッドを指定された時間スリープさせる静的メソッドです。Java 構文では、変数を介して静的メソッドを呼び出すことができますが、コンパイラは単にその変数のコンパイル時の型を使用して、呼び出すメソッドを決定します。
Thread ait = null;
ait.sleep(1000); // calls Thread.sleep(1000), causing current thread to sleep.
// In particular, does *not* NPE
またwait()
、これは静的ではなくインスタンスメソッドですが、現在のスレッドに待機をさせます(ait.wait(1000)
現在のスレッドを最大1秒または別のスレッドが呼び出すまで待機させますait.notifyAll()
)。
あるスレッドが別のスレッドを制御できるようにするために、Java の初期の頃に導入されたThread.suspend()
とそれに対応resume()
するものがありますが、それらは本質的にデッドロックが発生しやすいため、すぐに廃止されました。あるスレッドに別のスレッドを「制御」させたい場合に推奨されるパターンは、協調的に行うことです。つまり、スレッド A が設定し、スレッド B が読み取るある種の共有フラグを持ち、フラグに従って B がスリープ状態になるようにします。
volatile boolean threadBShouldRun = true;
// Thread B
while(true) {
if(threadBShouldRun) {
// do some stuff
} else {
Thread.sleep(1000);
}
}
// Thread A
if(someCondition) {
threadBShouldRun = false;
}
java.util.concurrent
しかし、一般的には、パッケージに含まれている機能を利用する方が簡単で、エラーが発生しにくくなります。マルチスレッドを正しく実行することは、見た目よりもはるかに困難です。