2014-05-21 51 views
0

我有两个线程:ABJava:停止从另一个线程的线程中的所有活动

有螺纹A无限循环:

while (true) { 
    // Do something 
} 

主题B被监测的一些感兴趣的状态给我。当状态改变时,我想要线程A停止任何进一步的执行。

下述溶液是不够的(在A其从B称为设定keepRunningtrue与方法):

while (keepRunning) { 
    // Do something 
} 

我不能等待的循环体,以螺纹A之前执行被暂停 - 我想要中断循环中调用的方法的执行。

有没有办法实现上述功能?

+1

'//做些什么?'究竟发生了什么?如果你告诉我们这些,我们可以给出更具体的建议。 – merlin2011

回答

1

您可以做几点修复,例如在A的循环中的关键点检查keepRunning。你也可以中断线程A,它只有在它调用任何抛出InterruptedException的方法时才会帮助你。

但是,你不能只是让线程在它的轨道上停下来,并且有很好的理由:这很容易发生死锁。曾经有一种方法Thread.stopThread.suspend那样做,they've been deprecated因为这些危险。从Java 8开始,该方法为throws UnsupportedOperationException

基本上,线程必须自行停止。它可以根据其他线程的请求(通过字段keepRunning或中断进行通信)来完成,但必须这样做。一个线程不能直接阻止另一个线程。

+0

我想你的意思是不推荐使用的Thread.suspend方法。 – Niemand

+0

其中一个,实际上。 – yshavit

+1

我选择了“检查关键点”的建议,结果并没有那么糟糕 - 我只有其中的6个。谢谢 – Vasiliy

1

你可以在任何时候中断线程,但是这只会触发一个InterruptedException在方法中应该检查这个。

但是,您可以尝试停止线程,但这是一个不安全的操作,因为它可能在任何时候发生,除非您非常小心,否则可能会使内存处于不一致状态。如果你要小心,你可以添加一些检查并尽早停止代码。

1

这是一个非常糟糕的主意,因为当有关键资源打开时会发生什么,例如,一份文件?它不会被关闭:

while (keepRunning) { 
    openFile(); 
    // gets stopped here 
    closeFile(); 
} 

这当然可以与其他的事情发生,以及,操作系统进程,网络插座,任何东西。你明白为什么这是一个坏主意?

您应该重新设计循环中的代码,以便更频繁地检查条件并在条件不成立的情况下中断并清理。

while (keepRunning) { 
    openFile(); 
    doLongOperation(); 
    if (!keepRunning) { 
     closeFile(); 
     break; // or return 
    } 
    doAnotherLongOperation(); 
    closeFile(); 
} 

这样,您不会失去安全性,同时能够更快地停止它。

您可能实际上并不使用宝贵的资源,但无论如何您应该告诉我们更多的细节,以便我们可以给出更准确的答案。