2016-11-24 65 views
1

当我从学生名archana抛出异常。 按我的理解invokeAll是完成等待所有任务,然后再返回未来列表执行人服务的异常处理

输出我得到的是

pool-1-thread-1 Helloprerna 
pool-1-thread-2 Helloabc 
HELLO SOMEERROR 
Execution Completed 

我想其他的任务输出为秀其不引发异常。任何建议

public class Executor { 

    public static void main(String args[]) throws InterruptedException{ 

     ExecutorService executor=Executors.newFixedThreadPool(5); 

     ArrayList<Student> list = new ArrayList<Student>(); 
     list.add(new Student("prerna")); 
     list.add(new Student("abc")); 
     list.add(new Student("archana")); 
     list.add(new Student("def")); 
     list.add(new Student("xyz")); 
     list.add(new Student("ritu")); 
     list.add(new Student("babita")); 

     try { 
      List<Future<String>> resultList=executor.invokeAll(list); 
      for(Future<String> f:resultList){ 
       //if(f.isDone()){ 
        System.out.println(f.get()); 
       //} 
      } 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }catch (ExecutionException e) { 
      // TODO Auto-generated catch block 
      System.out.println("HELLO SOME ERROR"); 
      //e.printStackTrace(); 
     } 

     executor.shutdown(); 
     executor.awaitTermination(10, TimeUnit.SECONDS); 
      System.out.println("Execution Completed"); 

    } 
} 

。所以在这里

try { 
    List<Future<String>> resultList=executor.invokeAll(list); 
    for(Future<String> f:resultList){ 
     try{ 
      System.out.println(f.get()); 
     }catch (ExecutionException e) { 
      System.out.println("HELLO SOME ERROR: " + e.getMessage()); 
     } 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

你会得到一切OK的结果和你:

public class Student implements Callable<String>{ 
    String name; 
    public Student(String name) { 
     super(); 
     this.name = name; 
    } 

    @Override 
    public String call() throws Exception { 
     // TODO Auto-generated method stub 
     if(name=="archana"){ 
      throw new Exception(); 
     } 
     return display(name); 
    } 

    private String display(String name2) { 
     try { 
     // System.out.println(Thread.currentThread().getName()); 
      name2=Thread.currentThread().getName()+" Hello"+ name; 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return name2; 
    } 

} 
+0

最简单的方法是在'call()'中捕获任何异常。你只需要弄清楚返回什么来表明执行没有完美的完成。其他选项是将'get()'调用用自己的try/catch块封装在for循环中。取决于你想在哪里以及如何处理异常行为。 – Fildor

+0

在应用程序的情况下,如果我们在调用方法中捕获异常,我们将在错误情况下返回什么。我的意思是将如何处理这种错误 – coder25

+1

这取决于您。取决于你的设计。你可以简单地返回null或者一个空字符串或者一些定义好的“Poison”常量......很多可能性。但就你的情况而言,我想如下面的答案中所描述的那样去做更为可行。 – Fildor

回答

2

就可以在try/catch语句移动:

原文:

try { 
    List<Future<String>> resultList=executor.invokeAll(list); 
    for(Future<String> f:resultList){ 
    // if(f.isDone()){ 

       System.out.println(f.get()); 

     //} 
    } 
} catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
}catch (ExecutionException e) { 
    // TODO Auto-generated catch block 
    System.out.println("HELLO SOME ERROR"); 
// e.printStackTrace(); 
} 

将是相当可以处理每项任务的特殊执行。

+0

理想情况下,它应该在呼叫方法内还是在周围捕获异常获得 – coder25

+1

@ coder25这取决于您可以以正确的方式处理异常,以便您的应用程序保持良好状态。 –

+0

那么,这个具体问题并没有真正的答案,因为示例代码看起来颇为理想。在现实生活中,它取决于可以处理异常**的位置。如果来电者不需要知道特殊行为,请在里面进行。如果呼叫者需要采取一些措施保持一致,那么你必须赶到外面。 – Fildor

0

这种模式应该是:主线程创建并调用从属线程,它应该返回ok值或错误值(如果有任何错误)。然后主线程应该收集从属结果并处理它们。

+1

你怎么知道?这完全是一个设计决定。 – Fildor