Я использую инфраструктуру Java ExecutorService для отправки вызываемых задач для выполнения. Эти задачи взаимодействуют с веб-службой, и применяется тайм-аут веб-службы в течение 5 минут. Однако я видел, что в некоторых случаях тайм-аут игнорируется и поток «зависает» при вызове API, поэтому я хочу отменить все задачи, которые занимают больше времени, чем говорят, 5 минут.Лучшая практика для прерывания потоков, длина которых превышает пороговое значение
В настоящее время у меня есть список фьючерсов, и я перебираю их и вызываю future.get, пока все задачи не будут завершены. Теперь я видел, что перегруженный метод future.get принимает тайм-аут и выдает таймаут, когда задача не завершается в этом окне. Поэтому я подумал о подходе, в котором я делаю future.get() с таймаутом, и в случае TimeoutException я делаю future.cancel (true), чтобы убедиться, что эта задача прервана.
Мои главные вопросы
1. Получается ли с таймаутом лучший способ решить эту проблему?
2. Есть ли вероятность, что я жду с вызовом get на задачу, которая еще не была помещена в пул потоков (is not active worker). В этом случае я могу завершить поток, который, когда он начнет, может завершиться в течение необходимого срока?
Любые предложения будут глубоко оценены.
Лучшая практика чтобы написать задания, чтобы они никогда не занимали слишком много времени, и их не нужно убивать извне. Остановка потока извне - это просто работа для нарушенной задачи. –
http://stackoverflow.com/questions/16277191/executor-service-timeout-of-thread –