Я использую внешнюю библиотеку (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 просто имеет более хороший график):
Кто-нибудь знает, как решить эту проблему, пожалуйста?
Примечание: я знаю, что не следует использовать устаревший метод остановки, я только что попробовалвсе, что я знаю, чтобы убить нить.