如何在Java中中断具有无限循环和休眠的线程

如何在Java中中断具有无限循环和休眠的线程,java,multithreading,thread-safety,interrupt,Java,Multithreading,Thread Safety,Interrupt,我已经为此奋斗了几个小时了。代码如下: @Override public void run() { try { wscript.setBid(0.30); wscript.setServiceMode(WebScript.ServiceMode.ON); for(;!Thread.currentThread().isInterrupted();) { Posi

我已经为此奋斗了几个小时了。代码如下:

@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,一切正常。然而,正如我所说的,当定位算法运行时,什么都没有发生,线程的行为就像从未得到中断状态一样。 当做 双核

编辑:对我来说,调用日志(“算法已被取消!”)是至关重要的;将在中断后执行

已解决:我已覆盖
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
标志(请参阅)和/或捕获了某个
中断异常
(或
异常
/
可丢弃


一种可能是使用另一个标志(例如使用
volatile
variable/
AtomicBoolean
/
ThreadLocal
)来指示是否应中断线程

您的意思是,当您调用service.interrupt时,Positioning()不会立即退出吗?或者如果调用service.interrupt和Positioning()返回,则条件if(Thread.currentThread().isInterrupted())不为真?当我调用此函数时,Positioning()不会立即退出,并且Positioning()返回后条件也不为真。
Positioning()正常< /代码>方法不会立即退出,如果它在某些工作的中间。但您至少可以设置
interrupted
标志。您能告诉我们
Positioning()
方法的内容吗?否则,JiriS的答案听起来是正确的。它有三个层次。我是说一个在另一个里面。检查太多了。我想我会尝试使用ThreadLocal变量(奇怪的是,我做不到)。第一段很好,但你的第二段没有意义。如果您可以在定位代码中添加检查标志,那么修复中断标志清除行为也同样容易。他使用的不是
interrupted()
,而是
isInterrupted()
,它不会清除标志。在任何情况下,他都应该使用自定义标志。即使是一个简单的易失性布尔值也可以做到这一点。不过,我会避免使用
ThreadLocal
,在这里使用它没有任何意义。至于@NathanHughes,使用显式标志更有意义,因为线程可以被作者旁边的其他代码打断。@Kayaman:如果您有“因为线程可以被作者旁边的其他代码打断”的参考,我想读一下。@Kayaman:我知道他没有使用
interrupted()
,但很明显,要么是
Positioning()
,要么是其他代码在调用它。@NathanHughes我错了,我想的是虚假的唤醒。然而,使用一个单独的标志来清楚地表明意图,而不是使用“中断”作为一般退出标志,这并不是一个坏主意。