JAVA 并发编程-返回执行结果(Callable和Future)(九)
发布日期:2022-01-11 03:09:54
浏览次数:2
分类:技术文章
本文共 1744 字,大约阅读时间需要 5 分钟。
启动一个线程不论使用Thread或者Runnable的时候,都是没有返回结果的。也就是说Thread和Runnable的run()方法必须没有返回值。
public void run(){}
解决方案:
Callable和Future,一个产生结果,一个拿到结果。
简单的来一个实例demo帮助我们理解:
- public class CallableAndFuture {
- /**
- * @param args
- */
- public static void main(String[] args) {
- //单一线程的线程池
- ExecutorService threadPool = Executors.newSingleThreadExecutor();
- Future<String> future =
- threadPool.submit(
- new Callable<String>() {
- public String call() throws Exception {
- Thread.sleep(2000);
- return "hello";
- };
- }
- );
- System.out.println("等待结果");
- try {
- System.out.println("拿到结果" + future.get());
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
执行结果:
等待结果
拿到结果hello
使用场景:
假设有一个很耗时的返回值需要计算,并且这个返回值不是立刻需要的话,那么就可以使用以上这种方式,用另一个线程去计算返回值,而当前线程在使用这个返回值之前可以做其它的操作,等到需要这个返回值时,再通过Future得到!
说明:
Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现的
Callable要采用ExecutorService的submit方法提交,返回为future对象
CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象
好比我同时种了几块地的麦子,然后就等待收割,收割时,哪块先成熟,则先收割哪块
下面我们来针对CompletionService看一个小demo
- public class CallableAndFuture {
- /**
- * @param args
- */
- public static void main(String[] args) {
- 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>() {
- @Override
- public Integer call() throws Exception {
- Thread.sleep(new Random().nextInt(5000));
- return seq;
- }
- });
- }
- for(int i=0;i<10;i++){
- try {
- System.out.println(
- completionService.take().get());
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
- }
- }
- }
执行结果:
8
6
5
7
2
1
3
10
9
4
转载地址:https://yuki-ho.blog.csdn.net/article/details/52316409 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月21日 23时45分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
L1-064 估值一亿的AI核心代码 (20 分)
2019-04-26
L2-033 简单计算器 (25 分)
2019-04-26
L2-034 口罩发放 (25 分)
2019-04-26
L2-019 悄悄关注 (25 分)
2019-04-26
L1-020 帅到没朋友 (20 分)
2019-04-26
L1-046 整除光棍 (20 分)
2019-04-26
L2-021 点赞狂魔 (25 分)【优化后的】
2019-04-26
L2-032 彩虹瓶 (25 分)
2019-04-26
L2-004 这是二叉搜索树吗? (25 分)
2019-04-26
L2-011 玩转二叉树 (25 分)
2019-04-26
L2-006 树的遍历 (25 分)
2019-04-26
L3-010 是否完全二叉搜索树 (30 分)
2019-04-26
6-10 阶乘计算升级版 (20 分)
2019-04-26
7-78 阅览室 (20 分)
2019-04-26
7-21 查验身份证 (15 分)
2019-04-26
实验4-1-5 韩信点兵 (10 分)
2019-04-26
1016 部分A+B (15 分)
2019-04-26
1023 组个最小数 (20 分)
2019-04-26
1036 跟奥巴马一起编程 (15 分)
2019-04-26