Остановить бесконечный цикл в пуле потоков Java - PullRequest
0 голосов
/ 24 мая 2018

У меня есть этот код:

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Boolean> f = executor.submit(() -> {
    if (true) {
        while (true);
    }
    return false;
});
try {
    System.out.println(f.get(10, TimeUnit.MILLISECONDS));
}
catch (InterruptedException | ExecutionException | TimeoutException e) {
    throw e;
}

Во время работы программы я получаю исключение, как и должно, но цикл while продолжает выполняться, и программа не останавливается.
Я пробовал executor.shutdown(), executor.shutdownNow(), f.cancel(true) и более.
У кого-нибудь есть идеи?Я пытаюсь решить эту проблему в течение трех дней.

1 Ответ

0 голосов
/ 24 мая 2018

Вы не должны использовать занятый цикл, но вы должны остановить его, если поток был прерван:

while (!Thread.interrupted()) {
    // do something
}

Вместо использования занятого цикла ваш поток долженждать сигнала или события.Или даже опрос с заданным интервалом.Занятый цикл, подобный тому, который вы описываете, просто израсходует процессор.

Например, вы можете просто вызвать wait для любого объекта, и ваш поток будет разбужен послепрервано.

try {
    (new Object()).wait();
} catch (InterruptedException e) {
    // Interrupted
}

Здесь обсуждается сигнализация потока: http://tutorials.jenkov.com/java-concurrency/thread-signaling.html

...