package cn.sunline.ant.task.concurrent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Test {
public static void main(String[] args) {
// 执行的服务
ExecutorService service = Executors.newFixedThreadPool(4);
CompletionService<Result> completion = new ExecutorCompletionService<Result>(service);//这个东西很关键
// 每个任务的执行结果
List<Future<Result>> futures = new ArrayList<Future<Result>>();
// 开始并发的跑任务
futures.add(completion.submit(new MyTask(10)));
futures.add(completion.submit(new MyTask(1)));
futures.add(completion.submit(new MyTask(5)));
for (int i = 0; i < 3; i++) {
try {
// 这里会阻塞等待任务完成
Result result = completion.take().get();
System.out.println(result.msg);
} catch (Exception e) {
e.printStackTrace();
}
}
//这里的顺序与任务请求的顺序不一定相同,具体要看每个任务的执行速度
for (Future<Result> f : futures) {
try {
// 这里会阻塞等待任务完成
Result result = f.get();
System.out.println(result.msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}
static class Result {
String msg;
}
static class MyTask implements java.util.concurrent.Callable<Result> {
int id;
public MyTask(int id) {
this.id = id;
}
@Override
public Result call() throws Exception {
Result ret = new Result();
ret.msg = "处理任务:" + id;
Thread.sleep(id * 1000);
return ret;
}
}
}