Javaでのwait()、notify()、join()などの方法
Javaではいくつかの方法がよく見られますが、ほとんどの場合、Objectクラスのwait()、notify()、Threadクラスのyield()、join()、sleep()が含まれています.
waitメソッドは、他のスレッドがnotifyでロックと競合するまで、if文ではなくループに配置することを推奨することに注意して、ロックを譲って待つことを示します.
notifyメソッドは、wait中のスレッドが競合ロックを開始できることを通知し、スレッドスケジューラはランダムにwait中のスレッドを選択し、notifyAllメソッドを呼び出すと、wait中のすべてのスレッドが同時にロックを競合します.注意現在のスレッドnotifyの後、すぐにロックを呼び出すのではなく、同期コードブロックを実行してからロックを呼び出す必要があります.
yieldメソッドThreadのstaticメソッドは,現在のスレッドがCPUを他の同じスレッドに優先させることを喜んでいることを示す.
joinメソッドコードt.join()は、tスレッドの実行が完了するまで呼び出しの下のコードを実行し続けることを示す.(ここでtはThreadオブジェクト)は、次のコードのようになります.
結果印刷:
sleepメソッドThreadクラスメソッドは、現在のスリープが一定期間指定されていることを示し、現在所有しているロックを譲らない.
waitメソッドは、他のスレッドがnotifyでロックと競合するまで、if文ではなくループに配置することを推奨することに注意して、ロックを譲って待つことを示します.
final Object obj = new Object();
Thread t = new Thread(){
@Override
public void run() {
boolean condition = true;
synchronized (obj) {
try {
while(condition) {
obj.wait();
//
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t.start();
notifyメソッドは、wait中のスレッドが競合ロックを開始できることを通知し、スレッドスケジューラはランダムにwait中のスレッドを選択し、notifyAllメソッドを呼び出すと、wait中のすべてのスレッドが同時にロックを競合します.注意現在のスレッドnotifyの後、すぐにロックを呼び出すのではなく、同期コードブロックを実行してからロックを呼び出す必要があります.
Thread t = new Thread(){
@Override
public void run() {
synchronized (obj) {
//
obj.notifyAll();
//
}
}
};
t.start();
yieldメソッドThreadのstaticメソッドは,現在のスレッドがCPUを他の同じスレッドに優先させることを喜んでいることを示す.
joinメソッドコードt.join()は、tスレッドの実行が完了するまで呼び出しの下のコードを実行し続けることを示す.(ここでtはThreadオブジェクト)は、次のコードのようになります.
Thread t = new Thread() {
public void run() {
System.out.println(" ");
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" ");
}
};
t.start();
try {
t.join();//t
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" ");
結果印刷:
sleepメソッドThreadクラスメソッドは、現在のスリープが一定期間指定されていることを示し、現在所有しているロックを譲らない.