Нить.isInterrupted не работает, нить.прерывается ли
Следующая программа демонстрирует проблему (последняя версия 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 ответа:
Это выглядит как известная проблема с многопроцессорными машинами, в основном в 64-битных версиях ОС и java от 1.5-7.0
ОПИСАНИЕ ЗАДАЧИ : При одновременном выполнении двух потоков первый поток прерывает второй с помощью потока.прерывать(). Второй поток проверяет, был ли он прерван вызовом потока.метод isInterrupted (), который всегда возвращает false.
Это происходит на многопроцессорном ПК, работающем под управлением 64-разрядной ОС (Vista и Linux). на 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 или более поздней.
Ripper234, я только что запустил это на своей машине, и она всегда останавливается независимо от того, какое значение я использую для отпечатков и какие прерывания использовать. Я использую jdk1.6.0_16. глядя на javadoc, возможно, это как-то связано с тем, что interrupted() очищает состояние (interrupted) после каждого вызова, а isInterrupted () - нет. тот факт, что иногда это срабатывает для Джерома, всегда для меня, и никогда(?) ибо вы могли бы указать разницу в jdks, которые мы используем, или скорость наших машин. если это имеет какое-то отношение к расчистке штата, что может объяснить изменчивость.