Java Object wait(long timeout, int nanos) メソッド
Object wait(long timeout, int nanos) メソッドは、現在のスレッドを待機(ブロック)状態にし、他のスレッドがこのオブジェクトの notify() メソッドまたは notifyAll() メソッドを呼び出すか、パラメータ timeout と nanos で設定されたタイムアウト時間を超えるまで待機させます。
このメソッドはwait(long timeout) メソッド似ていますが、nanos パラメータが追加されています。このパラメータは追加時間(ナノ秒単位、範囲は0-999999)を表します。したがって、タイムアウト時間にはさらに nanos ナノ秒を加える必要があります。
timeout と nanos のパラメータが両方とも0の場合、タイムアウトは発生せず、ずっと待機し続けます。これはwait() メソッド。
現在のスレッドはこのオブジェクトのモニター所有者である必要があります。そうでない場合はやはりIllegalMonitorStateException例外が発生します。
現在のスレッドが待機前または待機中に任意のスレッドによって割り込まれた場合、InterruptedException例外がスローされます。
渡されたパラメータが不正であるか、nanos が0-999999の範囲にない場合、IllegalArgumentException例外がスローされます。
構文
public final void wait(long timeout, int nanos)
パラメータ
timeout- 待機時間(ミリ秒単位)。
nanos- 追加待機時間(ナノ秒単位)。
戻り値
戻り値はありません。
例
以下の例は、wait(long timeout, int nanos) メソッドの使用法を示しています:
例
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class サンプルTest extends Object {
private List synchedList;
public サンプルTest() {
//同期リストを作成する
synchedList = Collections.synchronizedList(new LinkedList());
}
//リスト内の要素を削除する
public String removeElement() throws InterruptedException {
synchronized (synchedList) {
//リストが空なら待機し、10秒と500ナノ秒待機する
while (synchedList.isEmpty()) {
System.out.println("List is empty...");
synchedList.wait(10000, 500);
System.out.println("Waiting...");
}
String element = (String) synchedList.remove(0);
return element;
}
}
//リストに要素を追加する
public void addElement(String element) {
System.out.println("Opening...");
synchronized (synchedList) {
//要素を追加し、要素が存在することを通知する
synchedList.add(element);
System.out.println("New Element:'" + element + "'");
synchedList.notifyAll();
System.out.println("notifyAll called!");
}
System.out.println("Closing...");
}
public static void main(String[] args) {
final サンプルTest demo = new サンプルTest();
Runnable runA = new Runnable() {
public void run() {
try {
String item = demo.removeElement();
System.out.println("" + item);
} catch (InterruptedException ix) {
System.out.println("Interrupted Exception!");
} catch (Exception x) {
System.out.println("Exception thrown.");
}
}
};
Runnable runB = new Runnable() {
//要素追加操作を実行し、ループを開始する
public void run() {
demo.addElement("Hello!");
}
};
try {
Thread threadA1 = new Thread(runA, "Google");
threadA1.start();
Thread.sleep(500);
Thread threadA2 = new Thread(runA, "サンプル");
threadA2.start();
Thread.sleep(500);
Thread threadB = new Thread(runB, "Taobao");
threadB.start();
Thread.sleep(1000);
threadA1.interrupt();
threadA2.interrupt();
} catch (InterruptedException x) {
}
}
}
上記プログラムの実行結果は次のとおりです:
List is empty... List is empty... Opening... New Element:'Hello!' notifyAll called! Closing... Waiting... Waiting... List is empty... Hello! Interrupted Exception!
その他の拡張
Java Object クラス