以下程序演示了该问题(最新的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();
}
答案 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或我们机器的速度有所不同。如果它与清除国家有关,那可能解释了可变性。