wait、notify、join、および保護一時停止モード
waitとnotifyは、実行中のスレッドをTIMED_にブロックするためのObjectの方法です.WAITINGモードで、同じロックオブジェクトがブロックされているスレッドが実行を継続することを通知します.
一般的な使用パターンは次のとおりです.
保護一時停止モードは、このような方法で実現することができる.保護一時停止とは、1つのスレッドが結果を得るには、別のスレッドを待つ必要があるということです.
同期クラスを設計できます.
結果がまだない場合、getメソッドが存在するスレッドは、別のスレッドが結果を得て通知されるまで待機します.
さらにget()メソッドでは、タイムアウト時間を設定できます.Threadクラスのjoin法もこのパターンに似ている.
一般的な使用パターンは次のとおりです.
Object lock = new Object();
function1(){
syncronized(lock){
while( ){
lock.wait();
}
TODO other things...
}
}
function2(){
syncronized(lock){
lock.notify();
//lock.notifyAll();
}
}
保護一時停止モードは、このような方法で実現することができる.保護一時停止とは、1つのスレッドが結果を得るには、別のスレッドを待つ必要があるということです.
同期クラスを設計できます.
class GuardObject{
Object lock = new Object();
Object result = null;
pubblic Object get(){
syncronized(this){
while(null == result){
wait();
}
return result;
}
}
public void complete(Object result){
syncronized(this){
this.result=result;
notify();
//notifyAll();
}
}
}
結果がまだない場合、getメソッドが存在するスレッドは、別のスレッドが結果を得て通知されるまで待機します.
さらにget()メソッドでは、タイムアウト時間を設定できます.Threadクラスのjoin法もこのパターンに似ている.
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}