使Java 8中的复杂方法可以中断

时间:2016-01-14 09:59:18

标签: java multithreading java-8

我有非常复杂的方法,几乎​​没有循环和其他方法调用。我想让中断这种方法成为可能。我发现这样做的唯一解决方案是检查是否Thread.currentThread().isInterrupted()。问题是我想在每个循环的每个迭代中以及在其他几个地方检查它。在这之后,代码看起来并不那么好。

所以真的有两个问题  1.有什么其他方法可以在线程中断时停止方法,而不是一遍又一遍地检查同一个标志?  2.在每个循环中只添加!Thread.currentThread().isInterrupted()条件或使用下面的某个方法是否更好(主要是在性能方面)?

void checkIfInterrupted() {
    if (Thread.interrupted()) {
        throw new InterruptedException();
    }
}

1 个答案:

答案 0 :(得分:4)

首选方法是检查线程中每个循环的Thread.currentThread()。isInterrupted()。即Java Concurrency In Practice - Listening 7.5:

class PrimeProducer extends Thread {

    private final BlockingQueue<BigInteger> queue;

    PrimeProducer(BlockingQueue<BigInteger> queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            BigInteger p = BigInteger.ONE;
            while (!Thread.currentThread().isInterrupted())
                queue.put(p = p.nextProbablePrime());
        } catch (InterruptedException consumed) {
        /* Allow thread to exit */
        }
    }

    public void cancel() { interrupt(); }
    }
  

每次循环迭代中有两个点可能会中断   检测到:在阻塞放置调用中,并通过显式轮询   循环标题中的中断状态。明确的测试不是   因为阻塞放置调用,这里严格必要,但它使   PrimeProducer对中断更敏感,因为它会检查   在开始搜索a的冗长任务之前中断   素,而不是之后。调用可中断阻塞方法时   不足以提供所需的响应能力,   明确测试中断状态可能有所帮助。