Нить.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 8

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, которые мы используем, или скорость наших машин. если это имеет какое-то отношение к расчистке штата, что может объяснить изменчивость.