2015-09-04 3 views
0

Я использую ExecutorService и Callable в Java. Класс, реализующий Callable, выполняет некоторые операции ввода-вывода в файловой системе. Как остановить выполнение вызываемого и выйти из него, если возникает исключение?Выход из Java Callable, если произошло исключение

Это пример реализации класса Callable, который имеет два метода, foo1() и foo2()

public class MyCallable<Object> implements Callable<Object> { 
    public Object call() throws IOException, SQLException { 
     // method 1 , could throw IOException 
     foo1(); 
     // method 2 , could throw SQLException 
     foo2(); 
     return null; 
    } 
} 

Это класс примером службы исполнения. Он может иметь дело с исключениями, возникшими во время параллельной обработки через фьючерсный объект.

public class MyExecutorService { 
    ExecutorService listProcessor; 
    listProcessor = Executors.newFixedThreadPool(2); 
    List<Callable<Object>> callableTodo = new ArrayList<Callable<Object>>(); 

    // add the callables to the todo list 
    callableTodo.add(new MyCallable<Object>()); 
    callableTodo.add(new MyCallable<Object>()); 

    // start the threads 
    List<Future<Object>> futures = listProcessor.invokeAll(callableTodo); 
    listProcessor.shutdown(); 
    listProcessor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 

    // futures now holds possible exceptions 
    for (Future<Object> future : futures) { 
    try { 
     future.get(); 
    } catch (ExecutionException e) { 
     // process the exception 
    } 
    } 
} 

Но я хотел бы сразу позволить MyCallable остановку, если, например, IOException происходит в Foo1(), и не позволить ей продолжать foo2();

EDIT: Кроме того, если исключено исключение RuntimeException, такое как исключение RuntimeException в foo1(), MyCallable также необходимо остановить.

+2

Это то, что произойдет. Если foo1 генерирует исключение, метод call() немедленно прекратит выполнение. Что заставляет вас думать, что это не остановится? –

+0

Это не очевидно из моего первоначального вопроса, но будут ли исключения Runtime и заставить Callable остановиться? – tkja

+0

Да, конечно. Что еще может произойти? Вы должны действительно изучить основы исключений, прежде чем использовать параллелизм, что очень, очень, очень сложное. –

ответ

2

Подпись call метода Callable<V> «s является

V call() throws Exception

и его описание

Вычисляет результат, или выдает исключение, если не в состоянии сделать это.

Другими словами, просто не поймайте IOException. Если вы его не поймаете, выполнение прекратится, и исключение будет передано на уровень.

Примечание: это работает только для исключений, отличных от RuntimeExceptions, если метод помечен как металический тип исключения, который отмечен как call, поскольку он объявлен как throws Exception.

Как вы уже знаете, .get метод Future «s выбросит ExecutionException если Callable бросает исключение.

Смежные вопросы