簡體   English   中英

如何在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.

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