Как остановить 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();
Другие вопросы по тегам