为什么在可调用中设置中断位

因此,该资源( http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html )建议在线程不处理中断本身时设置线程中的中断位,“ 这样,调用堆栈上方的代码可以了解中断并在需要时响应它 。“

假设我正在使用ExecutorService在不同的Thread中运行某些东西。 我构造一个Callable并将此Callable传递给ExecutorService.submit(),它返回一个Future。 如果Callable被中断然后重置中断位,则在调用Future.get()时,关联的Future不会抛出InterruptedException。 那么,如果此Future是主线程访问生成的线程的唯一方式,那么在Callable中设置被中断位的目的是什么呢?

class MyCallable implements Callable { @Override public String call() { while (!Thread.currentThread().isInterrupted()) { } Thread.currentThread().interrupt(); return "blah"; } } ExecutorService pool = makeService(); Future future = pool.submit(new MyCallable()); // Callable gets interrupted and the Callable resets the interrupt bit. future.get(); // Does not thrown an InterruptedException, so how will I ever know that the Callable was interrupted? 

你是正确的,在这种情况下,2个线程之间没有传递中断标志(这就是内置的ExecutorService是出于何种原因而设计的)。 如果希望主线程看到可调用的中断状态,则必须从调用方法中抛出InterruptedException。

 class MyCallable implements Callable { @Override public String call() { // ... if(Thread.currentThread().isInterrupted()) { throw new InterruptedException(); } return "blah"; } } 

注意,在这种情况下,您仍然不会直接从Future.get()获取InterruptedException。 因为它是由callable抛出的,所以它将被包装在ExecutionException (这样你就可以区分可调用的中断和主线程的中断)。

中断线程应该终止它,但是以比kill()更不易碎的方式。 仅在各种阻塞操作期间检查线程的中断状态。

如果您的线程在其中一个操作期间被中断,则抛出InterruptedException 。 发生这种情况时,您希望尽快退出。 那么,如果执行程序服务线程被中断, Callable怎么做?

如果其操作很短,则一个有效选项是正常完成该操作,但在线程上设置中断状态,以便在此操作完成后执行程序服务将关闭。

如果操作更长,您可能希望抛出一个exception,告诉调用者该操作已被中断。