Future使用场景与分析

  前面分享了CountDownLatch的用法,但是由于分享过程中,发现有些朋友,问我Future与CountDownLatch的有什么区别?

  答案:只是concurrent包下的并发帮助工具类,两者并没有什么联系;对于CountDownLatch是关注与子线程的执行完毕情况,而Future是Callable执行call回调包装的返回值;

  Runnable是执行工作的独立任务,但是它不返回任何值,如果希望任务完成时能够返回一个值,那么可以实现Callable接口,而不是实现Runnable接口,在Java 1.5中引入Callable是一种具有类型参数的泛型,它的类型参数,是从call()函数中获取到的,而不是run()方法,并且必须使用ExecutorService.submit()方法调用它;

  

package demo.test;

import java.util.ArrayList;
import java.util.List;
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;

/**
 * futurn使用demo
 *
 * @author bqcoder
 * @version $Id: FuturnDemo.java, v 0.1 2016年11月22日 下午9:07:13 bqcoder Exp $
 */
public class FutureDemo {

    public static void main(String[] args) {

        List<Future<String>> taskResults = new ArrayList<Future<String>>();

        //创建线程池,使用future必须要使用executors.submit来调用,《乌龟的屁股,规定》
        ExecutorService executor = Executors.newCachedThreadPool();

        for (int i = 0; i < 10; i++) {
            Future<String> result = executor.submit(new TaskWithResult(i));
            taskResults.add(result);
        }

        //获取执行结果
        for (int i = 0; i < 10; i++) {
            try {
                System.out.println(taskResults.get(i).get());
            } catch (InterruptedException e) {
            } catch (ExecutionException e) {
            }
        }
    }
}

class TaskWithResult implements Callable<String> {

    private int taskId;

    TaskWithResult(int taskId) {
        this.taskId = taskId;
    }

    @Override
    public String call() throws Exception {
        return "执行结果:任务taskId=" + taskId;
    }

}

运行结果:

执行结果:任务taskId=0
执行结果:任务taskId=1
执行结果:任务taskId=2
执行结果:任务taskId=3
执行结果:任务taskId=4
执行结果:任务taskId=5
执行结果:任务taskId=6
执行结果:任务taskId=7
执行结果:任务taskId=8
执行结果:任务taskId=9

  submit()方法会产生Futurn对象,它用Callable返回结果的特定类型进行了参数化,可以使用Future.isDone()来判断Future查询是否完成,如果完成则返回ture,获取值通过get()方法进行获取,如果查询值还没有完成,则进入阻塞状态。

<未完待续分析~~~>

时间: 2024-08-10 02:11:48

Future使用场景与分析的相关文章

smartjs - DataManager 场景示例分析 - 数据懒加载

发一张policy的参数图设置图: 场景1 - 数据的懒加载/延迟加载 在很多时候,为了提高网页的加载速度,减少不必要的开销,会将页面的数据拆分成几个部分,首先加载呈现可视区域内的数据,然后剩下来的会在需要的时候在进行加载. 而这种按需加载的数据又分为两种: 1.按照需要进行加载:可以是由某个动作触发来引起,比如:tab,查看更多等: 2.采用缓存的方式:对后续动作的预知,提前将后续的数据加载进来,放入到缓存中:等需要的时候能提供快速的响应:比如:很多igrid的滚动分页 那么来看一下在data

【Cocos游戏实战】功夫小子第六课之游戏主功能场景的分析和实现

本节课的视频教程地址是:第六课在此 如果本教程有帮助到您,希望您能点击进去观看一下,而且现在注册成为极客学院的会员,验证手机号码和邮箱号码会赠送三天的会员时间,手机端首次也可以领取五天的会员时间哦(即使是购买年会员目前也仅仅是年费260),成为极客学院学习会员可以无限制的下载和观看所有的学院网站的视频,谢谢您的支持! 转载请注明出处:http://blog.csdn.net/suool/article/details/46851335 前言 经过前面五节课的学习我们目前还剩的未完成的工作就是游戏

【Cocos游戏实战】功夫小子第七课之游戏主功能场景逻辑功能和暂停功能场景的分析和实现

CSDN的markdown编辑器是吃屎了么! !.什么玩意.!写了一半写不了东西还全没了,搞个毛线! 本节课的视频教程地址是:第七课在此 假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊成为极客学院的会员,能够免费领取30天学习时间,免费拿极客学院VIP,1000+高清视频.学习Android.HTML5.iOS各种开发技术,限时领取.手快的戳:http://e.jikexueyuan.com/invite/index.html?ZnJvbV9jb2RlPVkxblJUZSZ1bmF

红黑树、B(+)树、跳表、AVL等数据结构,应用场景及分析,以及一些英文缩写

在网上学习了一些材料. 这一篇:https://www.zhihu.com/question/30527705 AVL树:最早的平衡二叉树之一.应用相对其他数据结构比较少.windows对进程地址空间的管理用到了AVL树 红黑树:平衡二叉树,广泛用在C++的STL中.map和set都是用红黑树实现的.我们熟悉的STL的map容器底层是RBtree,当然指的不是unordered_map,后者是hash. B/B+树用在磁盘文件组织 数据索引和数据库索引 Trie树 字典树,用在统计和排序大量字符

Java设计模式六大原则之场景应用分析

定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障. ??解决方案:遵循单一职责原则.分别建立两个类T1.T2,使T1完成职责P1功能,T2完成职责P2功能.这样,当修改类T1时,不会使职责P2发生故障风险:同理,当修改T2时,也不会使职责P1发生故障风险. ??说到单一职责原则,很多人都会不屑一顾.因为它太简单了.稍有经验的程

消息中间件的多个企业级场景案例--分析

1 用户注册后(会立即提示注册成功),过一会发送短信和邮件通知 发布/订阅模型 以上模式一般是用户注册成功后,写入一条数据到mysql,在发送一条消息到MQ! 如果不用消息中间件(或者简单的做成异步发送),做成了用户提交了注册之后,成功后,就同步立即执行发送邮件和短信服务脚本(这样耗时间),这样用户体验不好时间慢! 术语: SOA 2 把日志进行集中收集,用于日志分析和流量回放分析 术语:灰度发布,小流量 3 将数据源头复制到多个目的地,一般是要求顺序或者因果关系序的 用于跨机房数据传输,搜索

通过场景日志分析读取参数化的方式。

1.当用户名的参数化方式选择, 选择下一行:顺序 更新值的时间:每次迭代, 并发用户数:10个,运行时间10分钟,每种保存图表的事务均进行了140个事务,10个并发进行了140个事务,即每个并发进行了14个迭代,即选了14个用户,如果从001用户开始取值,根据每次迭代选新用户,则最后用的014用户, 为啥不是099用户,因为是顺序的读取用户因此使用的用户是   001---014用户: 2.用场景运行日志中的参数化结果去验证一下,发现日志中有10个log,编号分别从1-10:查看里面的日志可以看

数据库索引失效的一种场景:分析问题的思路和策略

这是公司研发团队发现的一个关于数据库索引失效方面的问题,我们的工程师对该问题进行了分析和解决并写了这份小结.归根揭底还是对开发框架和技术应用的把握上存在纰漏,但个人觉得在分析问题->找出原因->确认解决方案这一思路和策略上本文能起到一定借鉴作用,所以稍微梳理了一下拿出来和大家分享. 问题的现状是测试人员反馈某一个功能操作耗时很长(需要20秒以上),而开发人员核对代码发现无论从业务逻辑上还是代码实现上都没有问题,涉及到的数据查询等功能在数据库中也创建了合适的索引以确保查询效率,于是我们的工程师就

物联网架构的演进和场景技术分析

微信公众号(嵌入式企鹅圈)将新开辟专栏撰写物联网完整解决方案的相关技术,包括物联网架构.云服务.微信接口开发.智能设备开发等.鉴于本人研发的进展和需要时间进行原创总结,物联网专栏更新会比较慢,近期嵌入式企鹅圈仍以嵌入式Linux技术开发经验分享为主. 本文从场景和技术的角度去理解物联网技术和方案的演进,纯粹是个人观点,可能与主流定义稍有偏差. 一.物联网与物联设备 本人对物联网的理解是物联设备组成的网络,因此物联网需要两个要素,一是设备能够互联,另一个是能够组网.物联网往往又跟智能硬件概念相结合