我正在运行一个线程,其主要操作是使用阻塞函数调用代理,并等待它给它一些东西。

我已经使用了挥发性布尔值和中断的已知模式,但我不确定它是否会起作用:当我尝试为InterruptedException添加一个catch块时,我收到错误:

  

InterruptedException的无法访问的catch块。永远不会从try语句主体

抛出此异常

因此,如果我永远不会得到<=>,这意味着我永远不会退出阻止行动 - 因此永远不会停止。

我有点不解。有什么想法吗?

  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()视为你的条件。

其次,你的stop方法不起作用,因为它不会中断正确的线程。如果另一个线程调用stop,则代码使用Thread.currentThread(),这意味着调用线程将被中断,而不是正在运行的线程。

最后,什么是阻止方法?是scheduleSource()吗?如果该方法不抛出InterruptedException,则无法捕获它。

尝试以下方法:

private final AtomicReference<Thread> currentThread = new AtomicReference<Thread>();

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();
}

其他提示

只有少数明确定义的<!>阻塞方法<!>是可以打断的。如果线程被中断,则设置一个标志,但在线程到达这些明确定义的中断点之一之前不会发生任何其他事情。

例如,如果在使用read()和write()调用,则它们是可中断的nio / channels / InterruptibleChannel.html“rel =”noreferrer“> InterruptibleChannel 。如果使用Socket作为起点,则在读取中阻止interrupt()上的Thread无效。请注意,如果成功中断阻塞I / O操作,则会关闭基础通道。

另一大类可中断操作是对java.util.concurrent包中的类进行各种阻塞操作所引发的操作。当然,原始的wait()方法也是可以中断的。

可以通过在方法签名中查找throws InterruptedException来识别阻止方法。它们也应该被充分记录,以描述中断的任何副作用。

您可以编写自己的可中断方法,但它必须由可中断的低级操作本身组成。

stop方法在错误的线程上调用interruptThread.currentThread()是中断的线程,不会被中断。

好吧,伙计们,不要因此而杀了我。

我尝试使用Thread.stop()获取乐趣,将线程从阻塞操作中解脱出来,捕获ThreadDeath,保持目标线程活着,然后继续。

看起来很有效。世界并没有结束。但我只是说。你对自己的行为负责。我为什么要说唱?

你是如何从执行线程调用停止的?
如果你从另一个线程调用stop(),你将杀死它,而不是在try / catch块中运行的线程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top