2015-04-16 4 views
1

Я выполняю три задания из моего основного класса, создав 3 потока (extends Runnable) с помощью службы Executor и отправляя их. Как показано ниже:Java 1.6 - Возврат к основному классу из потока обслуживания исполнителя

ExecutorService executor = Executors 
         .newFixedThreadPool(3); 

       A a= new A(); 
       B b= new B(); 
       C c= new C(); 

       /** 
       * Submit/Execute the jobs 
       */ 
       executor.execute(a); 
       executor.execute(b); 
       executor.execute(c); 
       try { 
        latch.await(); 
       } catch (InterruptedException e) { 
        //handle - show info 
        executor.shutdownNow(); 
       } 

Когда в потоке возникает исключение, я его поймаю и делаю System.exit (-1). Но мне нужно вернуться к основному классу, если возникло какое-либо исключение и выполнить некоторые инструкции там. Как это сделать? Можем ли мы вернуть что-то из этих потоков без FutureTask?

ответ

5

Вместо подачи задания через execute, который не дает вам никакой возможности поймать исключение вне run методов, с помощью которых submit возвращающей Future<?>. Затем можно вызвать get, который может возвращать ExecutionException если что-то пошло не так:

Future<?> fa = executor.submit(a); 
try { 
    fa.get(); // wait on the future 
} catch(ExecutionException e) { 
    System.out.println("Something went wrong: " + e.getCause()); 
    // do something specific 
} 
+0

Можно добавить, что 'Runnable's может обернуть перехваченных проверенные исключения в экземпляр подкласса' RuntimeException' для того, чтобы повторно выдать ... – Holger

0

Вы можете реализовать свой собственный класс «FutureTask» и дать ему в качестве аргумента в конструктор по:

MyFutureTask futureA = new MyFutureTask(); 
A a = new A(futureA); 

Всякий раз, когда происходит ошибка в А хранить возвращаемое значение в вашей MyFutureTask, а затем может прочитать его как у вас будет нормальная FutureTask.

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

  • Нет связанных вопросов^_^