【发布时间】:2016-11-24 07:53:26
【问题描述】:
当我从学生名 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");
}
}
.
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 循环中。取决于您希望在何处以及如何处理异常行为。 -
在应用的情况下,如果我们在调用方法中捕获异常,我们将在错误的情况下返回什么。我的意思是如何完成这样的错误处理
-
这取决于你。取决于你的设计。您可以简单地返回 null 或一个空字符串或一些定义的“毒药”常量......很多可能性。但在你的情况下,我想按照我下面的回答中描述的那样去做会更可行。
标签: java multithreading future executorservice