中断等待阻塞操作的线程?
我正在运行一个线程,其主要操作是使用阻塞函数调用代理,并等待它给它一些东西。
我已经使用了挥发性布尔值和中断的已知模式,但我不确定它是否会起作用:当我尝试为InterruptedException
添加一个catch块时,我收到错误:
InterruptedException的无法访问的catch块。 永远不会从try语句主体抛出此exception
因此,如果我永远不会得到InterruptedException
,这意味着我永远不会摆脱阻塞行为 – 因此永远不会停止。
我有点不解。 任何想法?
public void run() { Proxy proxy = ProxyFactory.generateProxy(); Source source; while (!isStopped) { try { source = proxy.getPendingSources(); scheduleSource(source); } catch (Exception e) { log.error("UnExpected Exception caught while running",e); } } } public void stop() { this.isStopped = true; Thread.currentThread().interrupt(); }
首先,你不需要一个单独的标志(如果你这样做,使用AtomicBoolean ),只需检查Thread.currentThread().isInterrupted()
作为你的while条件。
其次,你的stop方法不起作用,因为它不会中断正确的线程。 如果另一个线程调用stop,则代码使用Thread.currentThread()
,这意味着调用线程将被中断,而不是正在运行的线程。
最后,什么是阻止方法? 是scheduleSource()
吗? 如果该方法不抛出InterruptedException
,您将无法捕获它。
请尝试以下方法:
private final AtomicReference currentThread = new AtomicReference (); public void run() { Proxy proxy = ProxyFactory.generateProxy(); Source source; currentThread.set(Thread.currentThread()); while (!Thread.currentThread().isInterrupted()) { try { source = proxy.getPendingSources(); scheduleSource(source); } catch (Exception e) { log.error("UnExpected Exception caught while running", e); } } } public void stop() { currentThread.get().interrupt(); }
只有少数明确定义的“阻塞方法”是可中断的。 如果线程被中断,则设置一个标志,但在线程到达这些明确定义的中断点之一之前不会发生任何其他事情。
例如,如果在使用InterruptibleChannel
创建的流上调用read()
和write()
调用,则它们是可InterruptibleChannel
。 如果使用Socket
作为起始点,则在读取中阻塞的Thread
上调用interrupt()
无效。 请注意,如果阻塞I / O操作成功中断,则关闭基础通道。
另一大类可中断操作是由java.util.concurrent
包中的类对各种阻塞操作抛出的操作。 当然,原始的wait()
方法也是可以中断的。
可以通过在方法签名中查找throws InterruptedException
来识别阻塞方法。 它们也应该被充分记录,以描述中断的任何副作用。
您可以编写自己的可中断方法,但它必须由可中断的低级操作本身组成。
你stop
方法是在错误的线程上调用interrupt
。 Thread.currentThread()
是正在中断但不被中断的线程。
好吧,人们,不要因此而杀了我。
我尝试使用Thread.stop()获得乐趣,将线程从阻塞操作中解脱出来,捕获ThreadDeath,保持目标线程活着,然后继续前进。
看起来很有效。 世界没有结束。 但我只是说。 你对自己的行为负责。 我为什么要说唱?
你是如何在执行线程中调用stop的?
如果你从另一个线程调用stop(),你将杀死它,而不是在try / catch块中运行的线程。