簡體   English   中英

中斷線程

[英]Interrupt the thread

 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)

使用wait()而不是sleep()允許你通過notify()喚醒線程,參見eg wait()和sleep()之間的區別

啟動時保持對線程的引用,並在該引用上調用Thread#interrupt 如果線程處於休眠狀態,則中斷將導致sleep方法將其睡眠時間縮短並拋出InterruptedException; 如果線程未休眠,則將設置中斷標志。

我有一個在這個答案中打斷一個線程的例子。

使用wait而不是sleep會意味着你必須引入共享鎖和條件變量。 等待線程必須獲取該鎖,然后在循環中等待,檢查條件變量。

條件變量和循環是必需的,原因如下:

1)線程可以在沒有收到通知的情況下從等待返回(“虛假喚醒”),並且

2)當線程沒有鎖時發出通知,並且一旦線程設法重新獲取鎖,就不知道狀態是否仍然與導致通知的狀態相同

在這種情況下,在這里使用中斷似乎要少得多。

您可以使用ArrayBlockingQueue並使用poll(long,java.util.concurrent.TimeUnit)

你所需要的就是喚醒腳步,將一些東西發布到隊列中。

請不要嘗試使用wait/notify因為有許多邊緣情況,該機制失敗。 例如,如果在wait超時后發生notify ,則下一個等待是否會立即完成? 使用BlockingQueue可以在適當的時候排空它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM