繁体   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