Thread.isInterrupted不起作用,Thread.interrupted确实有效

时间:2010-01-06 10:34:58

标签: java multithreading interrupted-exception

以下程序演示了该问题(最新的JVM& whatnot):

public static void main(String[] args) throws InterruptedException {
    // if this is true, both interrupted and isInterrupted work
    final boolean withPrint = false;

    // decide whether to use isInterrupted or interrupted.
    // if this is true, the program never terminates.
    final boolean useIsInterrupted = true;

    ExecutorService executor = Executors.newSingleThreadExecutor();
    final CountDownLatch latch = new CountDownLatch(1);
    Callable<Void> callable = new Callable<Void>() {
        @Override
        public Void call() throws Exception {
            Random random = new Random();
            while (true) {
                if (withPrint) {
                    System.out.println(random.nextInt());
                    System.out.flush();
                }
                if (useIsInterrupted)
                {
                    if (Thread.currentThread().isInterrupted())
                        break;
                }
                else
                {
                    if (Thread.interrupted())
                        break;
                }
            }
            System.out.println("Nice shutdown");
            latch.countDown();
            return null;
        }
    };
    System.out.println("Task submitted");
    Future<Void> task = executor.submit(callable);
    Thread.sleep(100);
    task.cancel(true);
    latch.await();
    System.out.println("Main exited");
    executor.shutdown();
}

2 个答案:

答案 0 :(得分:4)

这看起来像是一台带有多处理器机器的known issue,主要是64位操作系统和1.5 - 7.0版的java版本

问题描述: 在运行两个同时线程时,第一个线程使用Thread.interrupt()中断第二个线程。 第二个线程测试是否已经中断调用Thread.isInterrupted()方法,该方法总是返回false。

这发生在运行64位操作系统(Vista和Linux)的多处理器PC上。 在Vista 64位上,这种情况发生在使用64位JVM(所有版本从1.5到1.7)时,但在使用32位JVM时不会发生。 在Linux 64位上,当使用64位JVM(所有版本从1.5到1.7)或使用32位JVM(所有版本从1.5到1.7)时会发生这种情况。

解决方案是安装带有修复程序的版本,即1.6.0_16-b02或更高版本。

答案 1 :(得分:0)

ripper234,我刚刚在我的机器上运行它,无论我使用什么值打印以及使用哪些中断,它总是停止。我使用的是jdk1.6.0_16。看看javadoc,也许它与在每次调用后中断()清除(中断)状态和isInterrupted()不会这样的事实有关。事实上它有时候对于jerome来说,总是对我来说,而且从不(?)因为你可以表明我们正在使用的jdks或我们机器的速度有所不同。如果它与清除国家有关,那可能解释了可变性。