概述
Callable&Future
它们的作用是,我们启动一个线程,线程结束的时候会返回一个结果,
我们可以通过Callable启动一个带返回数据的线程,
通过Future获取线程返回的结果。
例子:
package cn.edu.hpu.test;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableAndFuture {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//创建一个单一线程池(只有一个线程)
ExecutorService threadPool=Executors.newSingleThreadExecutor();
//这里我们如果不需要线程返回结果,我们使用threadPool.execute(command);
//如果我们需要线程返回结果,就使用submit(Callable<T> task)方法
//我们使用future来拿到线程执行后的结果。
Future<String> future = threadPool.submit(new Callable<String>(){
public String call() throws Exception {
Thread.sleep(2000);//睡2秒
return "HelloWorld";
}
});
System.out.println("等待结果...");
System.out.println("线程执行后的结果为:"+future.get());
}
}
结果:
我们上面使用threadPool.submit(Callable<T> task)方法创建了一个带有返回参数的线程,
然后使用Future<T>拿到我们的线程返回的结果。
上面的例子有一个不好的地方,就是如果有多个线程,就要有多个Future对象和多个get语句,
如果第一个get语句的线程没有结束,没有返回结果,那么该future.get()就会一直处于等待
状态,那么它后面的线程任务如果比它提前完成了,也要一直等下去,直到前面线程返回结果
了才会去获取下一个线程的结果。所以我们要实时获取最快返回结果的线程,我们可以使用下
面的方法:
a.future.get(timeout, unit)
其中timeout是等待时间,unit是时间的格式(时/分/秒/天等),也就是等待多少时间之后,
如果没有返回结果,就报超时的异常。
但不推荐使用这个方法,因为还是要停下来等待, 最后还要报错,其实是不满足我们上面
的需求的。
b.CompletionService
用于提交一组Callable任务,其take方法返回已经完成的一个Callable任务
对应的Future对象。
这就好比我们同时煎了好多食材,然后等着把熟食材盛出来,盛食材的时候,应该是
哪一个食材先熟了,则先去盛那个食材。
例子:
//固定大小的线程池,大小为10个线程
ExecutorService threadPool2 = Executors.newFixedThreadPool(10);
CompletionService<Integer> completionService
= new ExecutorCompletionService<Integer>(threadPool2);
//提交10个任务
for (int i = 1; i <= 10; i++) {
final int seq=i;
completionService.submit(new Callable<Integer>(){
public Integer call() throws Exception {
//休眠5秒以内随机时间
Thread.sleep(new Random().nextInt(5000));
return seq;
}
});
}
//获取刚刚提交的线程任务的结果
for (int i = 1; i <= 10; i++) {
System.out.println(completionService.take().get());
}
结果:
completionService提交完多个任务之后,就可以等待返回结果,那个线程先返回
结果,completionService的take就get到那个结果。
转载请注明出处:http://blog.csdn.net/acmman/article/details/52891993
最后
以上就是傻傻水蜜桃为你收集整理的【Java多线程与并发库】9.Callable与Future的应用的全部内容,希望文章能够帮你解决【Java多线程与并发库】9.Callable与Future的应用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复