У меня есть поток, в котором у меня есть бесконечный цикл, делающий некоторые вещи в сети. Кажется, что я не получаю ответ каждый раз, когда делаю это, поэтому поток зависает на несколько секунд, что вызывает серьезные проблемы с моим программным обеспечением. Что мне нужно, так это какой-то «крайний срок» для цикла, если он занимает больше, чем (например, 100 мс), перезапустить снова.
private boolean active = true;
public void run(){
while(active){
//some network stuff e.g:
dnshandler.reverselookup("8.8.8.8");
}
}
(это не настоящий класс ... просто чтобы понять, что я имею в виду.)
Есть идеи, как с этим справиться?
Обновление:
Я обработал его отдельной нитью, как это было предложено. На самом деле я использовал Callable, потому что мне нужно возвращаемое значение.
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
try {
List<Future<String>> results = executor.invokeAll(Arrays.asList(new CallableClass()), 500), TimeUnit.MILLISECONDS);
for (Future<String> current : results) {
if (!current.isCancelled()) {
someValue = current.get();
} else {
// timeout
executor.shutdownNow();
}
}
} catch (Exception e) {
//handle it!
e.printStackTrace();
}
Но проблема, с которой я сейчас сталкиваюсь, заключается в том, что executor.shutdownNow()
не завершает зависшую задачу Callable (что является правильным поведением согласно Документации). Есть ли способ убить задачу исполнителя? (Я знаю, что это не чистое решение, но некоторые запросы обрабатываются библиотекой)