java 多线程 day10 获取线程的返回值 CallableAndFuture


import java.util.Random;
import java.util.concurrent.*;

/**
* Created by chengtao on 17/12/4.
*
* 获取线程的结果
* <T> Future<T> submit(Callable<T> task);
*/
public class Thread1001_CallableAndFuture {
public static void main(String[] args)throws Exception {
// future01();
// future02();
future03();
System.out.println("主线程 已经执行完了");
}

public static void future01() throws Exception{
ExecutorService threadPool = Executors.newFixedThreadPool(5);
Future<String> future =
threadPool.submit(
new Callable<String>() {
public String call() throws Exception {
Thread.sleep(2000);
return "hello";
};
}
);
System.out.println("等待结果");
System.out.println("拿到结果:" + future.get());
}

//设置 返回任务的时间
public static void future02() throws Exception{
ExecutorService threadPool = Executors.newSingleThreadExecutor();
Future<Integer> future =
threadPool.submit(
new Callable<Integer>() {
public Integer call() throws Exception {
Thread.sleep(2000);
return 5;
};
}
);
System.out.println("等待结果");
System.out.println("拿到结果:" + future.get(1, TimeUnit.SECONDS));
}

//一次提交多个任务,哪个任务先执行完,就先返回哪个任务的结果
public static void future03() throws Exception{

ExecutorService threadPool2 = Executors.newFixedThreadPool(10);
CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool2);
for(int i=1;i<=10;i++){
final int seq = i;
completionService.submit(new Callable<Integer>() {
public Integer call() throws Exception {
int sleepNum = new Random().nextInt(5000);
System.out.println("seq = " + seq + " sleep = " + sleepNum );
Thread.sleep(sleepNum);
return seq;
}
});
}
for(int i=0;i<10;i++){
System.out.println( completionService.take().get());
}
}
}
posted @ 2017-12-05 00:02  为爱奋斗不息  阅读(281)  评论(0编辑  收藏  举报