Thread.isInterrupted не работает, Thread.interrupted работает - PullRequest
8 голосов
/ 06 января 2010

Следующая программа демонстрирует проблему (последняя версия JVM и еще много чего):

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 ]

4 голосов
/ 06 января 2010

Это похоже на известную проблему с многопроцессорными машинами, в основном в 64-битных ОС и версиях Java от 1.5 - 7.0

ОПИСАНИЕ ЗАДАЧИ: При запуске двух одновременных потоков первый поток прерывает второй с помощью Thread.interrupt (). Второй поток проверяет, был ли он прерван, вызывая метод Thread.isInterrupted (), который всегда возвращает false.

Это происходит на многопроцессорном ПК с 64-битной ОС (Vista и Linux). В 64-битной Vista это происходит при использовании 64-битной JVM (все версии от 1,5 до 1,7), но не происходит при использовании 32-битной JVM. В Linux 64-bit это происходит при использовании 64-битной JVM (все версии от 1.5 до 1.7) или при использовании 32-битной JVM (все версии от 1.5 до 1.7).

Решение состоит в том, чтобы установить версию с исправлением, которое является 1.6.0_16-b02 или более поздним.

0 голосов
/ 06 января 2010

ripper234, я просто запустил это на своей машине, и он всегда останавливается, независимо от того, какое значение я использую для отпечатков и какие прерывания использовать. Я использую jdk1.6.0_16. Глядя на javadoc, возможно, это как-то связано с тем, что interrupted () очищает состояние (interrupted) после каждого вызова, а isInterrupted () - нет. тот факт, что это иногда работает для jerome, всегда для меня и никогда (?) для вас, может указывать на разницу в используемых нами jdks ИЛИ на скорость наших машин. если это имеет какое-либо отношение к очистке состояния, это может объяснить изменчивость.

...