Tirafesi:
私は忙しい待機設定するフラグにあるスピン・ウェイト・ループを持っています。しかし、それは取ることができますたくさんの分、あるいは時間-それが起こるための時間のを。
うのThread.sleepが()よりも効率的Thread.onSpinWait() ?
tevemadar:
簡単な例を見てみたかった、あなたはそうObject
とその長期利用可能wait()
とnotify/All()
する方法?(彼らはすでにそこにJLS 1.0 20+年前から、)
もうこれ以上言わない:
public class NotifyTest {
private boolean flag = false;
public synchronized boolean getFlag() {
return flag;
}
public synchronized void setFlag(boolean newFlag) {
flag = newFlag;
notifyAll();
}
public static void main(String[] args) throws Exception {
final NotifyTest test = new NotifyTest();
new Thread(new Runnable() {
@Override
public void run() {
System.out.printf("I am thread at %,d, flag is %b\n",
System.currentTimeMillis(), test.getFlag());
synchronized (test) {
try {
test.wait();
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
System.out.printf("I am thread at %,d, flag is %b\n",
System.currentTimeMillis(), test.getFlag());
}
}).start();
System.out.printf("I am main at %,d, flag is %b\n",
System.currentTimeMillis(), test.getFlag());
Thread.sleep(2000);
test.setFlag(true);
System.out.printf("I am main at %,d, flag is %b\n",
System.currentTimeMillis(), test.getFlag());
}
}
あなたの待ちループを行うには何かを持っている場合は、Object.wait()
あまりにもタイムアウト付きのバリアントを持っています。
オブジェクトができるようwait()
に-ed、その後、待機中のスレッドに通知することができます(ウェイターの1つを介してnotify()
、またはそれらのすべてを経由してnotifyAll()
)、そして彼らもお互いを知っている必要はありません。
待機と通知の両方が同期ブロック内で起こることがあるとして、ブロックを開始し、変数/フラグ/何かをチェックして、(ちょうどこれらの構築物はここには示されていない)条件付きで待機を発行し、安全かつ可能です。