[英]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.