多线程学习(二)
如果希望在任务完成时返回一个值,那么可以实现callable接口
public class TaskWithResult implements Callable<String> {
private int id;
public TaskWithResult(int id) {
super();
this.id = id;
}
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
return "result of taskWithResult " + id;
}
public static void main(String[] args) {
ArrayList<Future<String>> results = new ArrayList<>();
// 运行方式一
// 不使用Executor运行Future
// for (int i = 0; i < 10; i++) {
// FutureTask<String> futureTask = new FutureTask<>(new
// TaskWithResult(i));
// new Thread(futureTask).start();
// results.add(futureTask);
// }
// 运行方式二 使用Executor.submit来提交callable任务
ExecutorService service = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
results.add(service.submit(new TaskWithResult(i)));
}
for (Future<String> f : results) {
try {
System.out.println(f.get());
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
service.shutdown();
}
}
}
}
callable的运行会产生Future对象,可以使用isDone()方法来查询Future是否完成。当任务完成时,它具有一个结果,可以调用get()方法来获取这个结果。也可以不使用isDone()直接调用get(),这种情况下get()将阻塞。直至结果准备就绪。