import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableAndFuture {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newSingleThreadExecutor();
Future<String> future = threadPool.submit( //submit 会调用Callable方法 会有返回结果
new Callable<String>() {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
Thread.sleep(2000);
return "hello";
}
}
);
System.out.println("等待结果");
try {
System.out.println("拿到结果:"+ future.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ExecutorService threadPool2 = Executors.newFixedThreadPool(10);
// CompletionService 用于提交一组Callable任务
CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool2);
for(int i = 0; i< 10 ; i++){
final int squence = i;
completionService.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
Thread.sleep(new Random().nextInt(5000));
return squence;
}
});
}
for(int i=0; i<10; i++){
try {
System.out.println(completionService.take().get()); // 先取得先运行完的线程返回的结果
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Callable与Future的应用
最新推荐文章于 2021-09-28 18:36:05 发布