[英]How to synchronize Thread.sleep and Thread.interrupt in Java?
[英]How to interrupt a thread with infinite loop and sleep in Java
我已經為此戰斗了幾個小時。 這是代碼:
@Override
public void run()
{
try
{
wscript.setBid(0.30);
wscript.setServiceMode(WebScript.ServiceMode.ON);
for(;!Thread.currentThread().isInterrupted();)
{
Positioning(demandedPosition, maximumBid);
if(Thread.currentThread().isInterrupted())
break;
Thread.sleep(10000);
}
wscript.setServiceMode(ServiceMode.OFF);
Log("Algorithm has been canceled!");
}
catch (InterruptedException e)
{
wscript.setServiceMode(ServiceMode.OFF);
Log("Algorithm has been canceled!");
return;
}
事情是,我想用這段代碼合法地打斷它:
private void StopService()
{
service.interrupt();
}
當我在Thread.sleep()運行時調用此方法時,它將獲取InterruptedException並且一切正常。 但是,正如我所說的,當PositioningAlgorithm運行時,什么也沒有發生,線程的行為就像它從未處於中斷狀態一樣。 問候,雙核
編輯:對我來說,至關重要的是調用Log(“ Algorithm has been cancelled!”); 將在中斷后執行。
已解決:我已經覆蓋Thread.interrupt()
來編輯類本地變量,該類已檢查線程是否已准備好結束:
service = new Thread(mechanism)
{
@Override
public void interrupt()
{
super.interrupt();
mechanism.ReadyToReturn = true;
}
};
這是更新的線程主算法:
@Override
public void run()
{
try
{
wscript.setBid(0.30);
wscript.setServiceMode(WebScript.ServiceMode.ON);
for(;!ReadyToReturn || !Thread.currentThread().isInterrupted();)
{
Positioning(demandedPosition, maximumBid);
if(ReadyToReturn || Thread.currentThread().isInterrupted())
break;
Thread.sleep(10000);
}
wscript.setServiceMode(ServiceMode.OFF);
Log("Algorithm has been canceled!");
}
catch (InterruptedException e)
{
wscript.setServiceMode(ServiceMode.OFF);
Log("Algorithm has been canceled!");
return;
}
}
發生這種情況的原因是,定位清除了isInterrupted
標志(請參閱https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupted%28%29 )和/或在某個地方捕獲InterruptedException
(或Exception
/ Throwable
)。
一種可能性是使用另一個標志(例如,使用volatile
變量/ AtomicBoolean
/ ThreadLocal
)來指示是否應中斷線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.