Thread.onSpinWait対のThread.sleep()

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())、そして彼らもお互いを知っている必要はありません。
待機と通知の両方が同期ブロック内で起こることがあるとして、ブロックを開始し、変数/フラグ/何かをチェックして、(ちょうどこれらの構築物はここには示されていない)条件付きで待機を発行し、安全かつ可能です。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=223464&siteId=1