Я пишу java-программу для HTTP-вызова сервера в другом потоке. Следующий код я выполняю в отдельной вызываемой задаче в исполнителе пула потоков.
public static class MyRunnable implements Callable<Boolean>{
@Override
public Boolean call() {
HttpURLConnection conn = null;
try {
URL url = new URL("http://www.myserver.com");
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
int response = conn.getResponseCode();
return response == 200;
}
catch (IOException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
По какой-то причине сервер не отвечает или сервер отвечает очень медленно. Из-за поведения этого сервера ни тайм-аут соединения, ни таймауты чтения никогда не происходят.
Следовательно, я хочу отслеживать эту задачу (выполняющуюся в исполнителе пула потоков) и через некоторое время прервать поток и убедиться, что я удалю эту задачу из пула, чтобы пул потоков не содержал эту задачу и освободил все ресурсы, занятые этим нить.
Я пробовал Future
java, как показано ниже
ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 5, 5, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
Future<Boolean> f = tpe.submit(new MyRunnable());
try {
Boolean success = f.get(5000, TimeUnit.MILLISECONDS);
} catch (Exception e) {
e.printStackTrace();
}
С помощью этого кода я получаю TimeoutException
от вызова f.get
через 5000 миллисекунд, если поток, который обрабатывает MyRunnable
задачу, не отвечает. Но я вижу, что задача будет продолжать выполняться в исполнителе пула потоков, если он застрял на HttpURLConnection.getResponseCode()
.
Когда я попробовал f.cancel(true)
, он не прерывает поток, когда задача застревает на HttpURLConnection.getResponseCode()
вызове метода. Я понимаю, что поток будет прерван только тогда, когда он проверит его при следующей возможности. Следовательно, я полагаю, что future.cancel
в этом случае не поможет.
Итак, как мне выйти из этого вызова (взаимодействуя с исполнителем пула потоков) и убедиться, что задача удалена из пула и соответствующий поток свободен для обработки различных задач?
Заранее благодарим за ответ.
Спасибо,
Раагу
Executors.newXXX
, а не конструктор. Во-вторых, ваш вопрос неясен - у вас установлен тайм-аут в 5 секунд (используйтеTimeUnit.SECONDS.toMillis(5)
вместо5000
), поэтому соединение прервется через 5 секунд. Что вы имеете в виду под задачей будет продолжать работать в пуле потоков? - person Boris the Spider   schedule 22.04.2014MyRunnable
, он не компилируется, возврат True / False отсутствует. Также второй образец кода не компилируется, конструктор, принимающий String, отсутствует для runnable. - person cheffe   schedule 22.04.2014