Убить поток Java без циклов - PullRequest
0 голосов
/ 31 декабря 2018

Я использую внешнюю библиотеку (Generex) в своем проекте, и одному конструктору может потребоваться очень много времени для выполнения, поэтому я хотел бы иметь тайм-аут (скажем, 50 мс) и иметь возможность узнатьесли тайм-аут был достигнут или нет.

Итак, я подумал об использовании выделенного потока и написал следующий код:

@Test
public void isComputable() throws InterruptedException {
    for (int i=0; i<10;i++)
        System.out.println(check());

    Thread.sleep(300000);
}

private static boolean check() {

    final Thread stuffToDo = new Thread(() -> {while(true){}});

    final ExecutorService executor = Executors.newSingleThreadExecutor();
    final Future future = executor.submit(stuffToDo);
    executor.shutdown();

    try {
        future.get(50, TimeUnit.MILLISECONDS);
    }
    catch (InterruptedException | ExecutionException | TimeoutException ie) {
        stuffToDo.interrupt();
        stuffToDo.stop();
        return false;
    }
    if (!executor.isTerminated())
        executor.shutdownNow();
    return true;
}

Я заменил вызов внешней библиотеки циклом while (true), но этоважно отметить, что в моем случае я не могу использовать цикл для проверки прерывания потока.

При выполнении этого кода у меня есть хороший ответ через 50 мс длякаждый вызов, но поток не уничтожается, и при этом наблюдается высокая загрузка ЦП, как мы видим в JProfiler (обратите внимание, что цикл в тесте над i просто имеет более хороший график):

enter image description here

Кто-нибудь знает, как решить эту проблему, пожалуйста?

Примечание: я знаю, что не следует использовать устаревший метод остановки, я только что попробовалвсе, что я знаю, чтобы убить нить.

1 Ответ

0 голосов
/ 31 декабря 2018

Вы должны либо регулярно проверять прерывание в своем коде, либо запускать код в другом процессе.Это единственные способы, которыми вы можете либо прервать, либо уничтожить процесс, выполняющий код.

Я предлагаю выполнить трассировку стека для долго работающего потока, чтобы помочь исправить его в будущем.

...