У меня есть поток, внутри которого происходит вызов базы данных, который иногда зависает, обычно тайм-аут должен обрабатываться в клиентской библиотеке, но в этом случае клиентская библиотека не обрабатывает его правильно, поэтому мне нужно добавить дополнительное запланированное задание отменить поток, который делает вызов db, если это занимает слишком много времени, чтобы избежать обратного давления.
Прямо сейчас я заканчиваю поток через
final Future handler = executor.submit(new MyTask());
executor2.schedule(new Runnable(){
public void run(){
handler.cancel(true);
}
}, 3, TimeUnit.SECONDS);
Есть ли правильный способ прервать поток без TimeUnit.MILLISECONDS.sleep(1);
? Добавление сна кажется хакерским
@Override
public Boolean call() {
try {
// Sometimes hangs
db.call();
// Need it to be here to call InterruptedException
TimeUnit.MILLISECONDS.sleep(1);
return true;
} catch (InterruptedException e) {
return false;
}
}