当我从学生名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;
}
}
最简单的方法是在'call()'中捕获任何异常。你只需要弄清楚返回什么来表明执行没有完美的完成。其他选项是将'get()'调用用自己的try/catch块封装在for循环中。取决于你想在哪里以及如何处理异常行为。 – Fildor
在应用程序的情况下,如果我们在调用方法中捕获异常,我们将在错误情况下返回什么。我的意思是将如何处理这种错误 – coder25
这取决于您。取决于你的设计。你可以简单地返回null或者一个空字符串或者一些定义好的“Poison”常量......很多可能性。但就你的情况而言,我想如下面的答案中所描述的那样去做更为可行。 – Fildor