Javaのwaitとsleepの違いを詳しく説明します。
1.概要
この短い文章の中で、核心Javaの標準sleep()とwait()の方法を見て、それらの違いと類似点を知る。
2.waitとsleepの一般的な違い
簡単に言えば、wait()はスレッド同期のための例示的な方法である。
Java.lang.Objectで定義されているので、どのオブジェクトでも呼び出すことができますが、synchronizedブロックからしか呼び出されません。オブジェクトのロックを解除して、他のスレッドがロックに飛び込むことができます。
一方、Thread.sleep()は、任意のコンテキストから呼び出すことができる静的な方法である。Thread.sleep()は現在のスレッドを停止し、ロックを解除しません。
以下はこの二つのコアAPIに対する初歩的な理解である。
Thread‘main’is woken after sleepping for 1 second
Object‘java.lang.Object@31befd9f'is woken after waiting for 1 second
3.waitとsleepを起動する
sleep()法を使うと,スレッドは指定された時間間隔後に起動し,中断されない限り起動する。
wait()に対して、起こし方がちょっと複雑です。待ち時間のモニター上のnotify()またはnotifyAll()方法を呼び出してスレッドを起動することができます。
待ち状態のスレッドを全て起動する場合は、notifyAll()を使ってください。wait()メソッド自体と同様に、同期コンテキストからnotify()とnotifyAll()を呼び出す必要があります。
例えば、ここで待ってもいいです。
Waiting for ThreadB to complete…
ThreadBはすでに完了しました。スレッドの合計は704982704です。
4.結論
これはJavaの中で待つと睡眠の意味の速い入門です。
一般的に、sleep()を使ってスレッドの実行時間を制御し、wait()を使ってマルチスレッド同期を行うべきである。もちろん、基礎知識を深く理解した上で、もっと探求するべき内容があります。
以上は小编が绍介したJava中waitとsleepの违いを详しくまとめました。皆さんに助けてほしいです。ここでも私たちのサイトを応援してくれてありがとうございます。
この短い文章の中で、核心Javaの標準sleep()とwait()の方法を見て、それらの違いと類似点を知る。
2.waitとsleepの一般的な違い
簡単に言えば、wait()はスレッド同期のための例示的な方法である。
Java.lang.Objectで定義されているので、どのオブジェクトでも呼び出すことができますが、synchronizedブロックからしか呼び出されません。オブジェクトのロックを解除して、他のスレッドがロックに飛び込むことができます。
一方、Thread.sleep()は、任意のコンテキストから呼び出すことができる静的な方法である。Thread.sleep()は現在のスレッドを停止し、ロックを解除しません。
以下はこの二つのコアAPIに対する初歩的な理解である。
private static Object LOCK = new Object();
private static void sleepWaitExamples()
throws InterruptedException {
Thread.sleep(1000);
System.out.println(
"Thread '" + Thread.currentThread().getName() +
"' is woken after sleeping for 1 second");
synchronized (LOCK) {
LOCK.wait(1000);
System.out.println("Object '" + LOCK + "' is woken after" +
" waiting for 1 second");
}
}
この例を実行すると、以下の出力が生成されます。Thread‘main’is woken after sleepping for 1 second
Object‘java.lang.Object@31befd9f'is woken after waiting for 1 second
3.waitとsleepを起動する
sleep()法を使うと,スレッドは指定された時間間隔後に起動し,中断されない限り起動する。
wait()に対して、起こし方がちょっと複雑です。待ち時間のモニター上のnotify()またはnotifyAll()方法を呼び出してスレッドを起動することができます。
待ち状態のスレッドを全て起動する場合は、notifyAll()を使ってください。wait()メソッド自体と同様に、同期コンテキストからnotify()とnotifyAll()を呼び出す必要があります。
例えば、ここで待ってもいいです。
synchronized (b) {
while (b.sum == 0) {
System.out.println("Waiting for ThreadB to complete...");
b.wait();
}
System.out.println("ThreadB has completed. " +
"Sum from that thread is: " + b.sum);
}
そして、これはもう一つのスレッドが待ちスレッドを起動する方法です。モニタでnotifyを呼び出します。
int sum;
@Override
public void run() {
synchronized (this) {
int i = 0;
while (i < 100000) {
sum += i;
i++;
}
notify();
}
}
この例を実行すると、以下の出力が生成されます。Waiting for ThreadB to complete…
ThreadBはすでに完了しました。スレッドの合計は704982704です。
4.結論
これはJavaの中で待つと睡眠の意味の速い入門です。
一般的に、sleep()を使ってスレッドの実行時間を制御し、wait()を使ってマルチスレッド同期を行うべきである。もちろん、基礎知識を深く理解した上で、もっと探求するべき内容があります。
以上は小编が绍介したJava中waitとsleepの违いを详しくまとめました。皆さんに助けてほしいです。ここでも私たちのサイトを応援してくれてありがとうございます。