3
 protected void waitAndSweep(String symbol) {
    try { 
      long sweepTime = symbolInfo.getSweepTime(symbol);
      long timeSinceLastSweep = System.currentTimeMillis() - sweepTime;
      long waitTime = timeSinceLastSweep >= getInterval() ? 0 : getInterval() - timeSinceLastSweep;
      logTradeEvent("waitAndSweep", symbol, "waittime: " + waitTime);
      if (waitTime > 0){
          Thread.sleep(waitTime);  
      }
      callSweep(symbol);
    }catch (InterruptedException e) {
      Thread.currentThread().interrupt();
    }catch (Exception e) {
      logEvent(StrategyEntry.ERROR, "waitAndSweep", symbol,
          "Exception caught...", e);
    }
  }

スリープ中 (Thread.sleep) に、このスレッドを中断して、waitandSweep メソッドから抜けるにはどうすればよいですか?

private void replace(){
// interrupt the thread;
// call waitandsweep again here;
waitandsweep(symbol)
4

3 に答える 3

4

wait()の代わりに を使用sleep()すると、 経由でスレッドをウェイクアップできます。notify()たとえば、wait() と sleep() の違いを参照してください。

于 2015-09-23T12:34:40.593 に答える
1

開始時にスレッドへの参照を保持し、その参照でThread#interruptを呼び出します。スレッドがスリープ状態の場合、割り込みによってスリープ メソッドがスリープを短くし、InterruptedException をスローします。スレッドがスリープしていない場合は、中断フラグが設定されます。

この回答でスレッドを中断する例があります。

スリープの代わりに待機を使用すると、共有ロックと条件変数を導入する必要があります。待機中のスレッドは、そのロックを取得してからループで待機し、条件変数をチェックする必要があります。

条件変数とループが必要な理由はいくつかあります。

1) スレッドは、通知を受信せずに待機から戻ることができます (「偽のウェイクアップ」)。

2) スレッドがロックを持っていない間に通知が行われ、スレッドがロックを再取得した後、状態が通知を引き起こした状態と同じであるかどうかはわかりません。

この場合、ここで割り込みを使用する方がはるかに問題が少ないようです。

于 2015-09-23T12:39:24.180 に答える