在java中,我们知道创建线程一般有2中方式,一种是继承Thread,一种是实现Runable接口。但是这两种方法都不能返回线程处理后果的结果,如果想要获取线程处理过后的结果,需要共享线程变量或线程间通信,这样一来就需要考虑各种线程安全的问题。而使用Callable和Future的方式就很好的解决了这个问题。
下面是一个简单的demo
static ExecutorService executorService = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
List<Future> futureList =new ArrayList<>();
for(int i=0;i<10;i++){
Future<Integer> future = executorService.submit(new Task(i));
futureList.add(future);
}
int sum = 0;
for(Future<Integer> future : futureList){
while (true){
if(future.isDone() && !future.isCancelled()){
try {
int result = future.get();
sum = sum + result;
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
break;
}
}
}
System.out.println("主线程结束,sum为:"+sum);
}
static class Task implements Callable<Integer>{
private int i =0;
public Task(int i) {
this.i = i;
}
@Override
public Integer call() throws Exception {
Thread.sleep(1000);
System.out.println("子线"+ i +"程结束");
return i;
}
}
运行结果如下:
子线4程结束
子线9程结束
子线5程结束
子线0程结束
子线8程结束
子线1程结束
子线3程结束
子线7程结束
子线2程结束
子线6程结束
主线程结束,sum为:45