Как остановить Callable, представленный в ExecutorService?
Я пытаюсь реализовать пример приложения для тестирования Callable
а также ExecutorService
интерфейсы.
В моем приложении я заявил:
ExecutorService exSvc = Executors.newSingleThreadExecutor();
Затем:
Future<Integer> test = exSvc.submit(
new Callable<Integer>() {
public Integer call() {
for(int i = 0; i < 1000; i++){
System.out.println(i);
}
return 1;
}
});
Сейчас я пытаюсь остановить процесс до его завершения, я использую exSvc.shutdownNow()
но это не работает
Изящно прекратить классический Thread
Я обычно использую какую-то переменную условия. Какой общий подход следовать ExecutorService
?
2 ответа
Future.cancel(true)
а также ExecutorService.shutdownNow()
использовать прерывание потока. Пока вы не делаете бесперебойную блокировку вызовов в своей задаче, все, что вам нужно, это правильно обрабатывать прерванное состояние, что-то вроде этого:
for(int i = 0; i < 1000; i++){
// Uses isInterrupted() to keep interrupted status set
if (Thread.currentThread().isInterrupted()) {
// Cannot use InterruptedException since it's checked
throw new RuntimeException();
}
System.out.println(i);
}
Если вы делаете беспрерывную блокировку вызовов (например, сетевой ввод-вывод), все становится более сложным, вам нужно как-то прерывать их вручную, например, закрывая нижележащие сокеты.
Вот как я бы сделал это с FixedThreadPool
Надеюсь, это поможет.
ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
List<Future<Void>> results = new ArrayList<>();
for (int i = 0; i < numberOfJobs; i++) {
MyCallableJob job = new MyCallableJob (...);
results.add(pool.submit(job));
}
for (Future<Void> result : results) {
try { result.get(); }
catch (InterruptedException | ExecutionException ignorable) { }
}
pool.shutdown();