应用场景

财务成本核算。可能会有多个耗时的步骤。如果顺序执行是非常慢的。再相互数据获取数据不依赖的情况下可以使用Future并行执行

public class FutureTest implements Callable<BigDecimal> {

    private String sqlQueryStr;
public FutureTest(String sqlQueryStr) {
this.sqlQueryStr=sqlQueryStr;
}
@Override
public BigDecimal call() throws Exception {
// TODO Auto-generated method stub
System.out.println(sqlQueryStr+"查询数据库获取数据");
return new BigDecimal(3);
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executorService=Executors.newFixedThreadPool(2);
FutureTask<BigDecimal> futureTask=new FutureTask<BigDecimal>(new FutureTest("进货列表sql"));
FutureTask<BigDecimal> futureTask2=new FutureTask<BigDecimal>(new FutureTest("销售列表sql"));
Future future= executorService.submit(futureTask);
executorService.execute(futureTask2);
BigDecimal money1=futureTask.get();
BigDecimal money2=futureTask.get();

/**
* submit和execut的区别
* submit有返回值 execut没有
* submit返回值可以执行cancel执行取消操作 或者通过调用get 是否等于null 判断是否执行结束
*/
}

自己实现future异步加载

public class SimpleReusltData {
boolean state = false;
String data; public synchronized String getData() throws InterruptedException {
//如果数据没获取回来则等待
if (!state) {
wait();//释放锁。等待唤醒
}
return data;
} public boolean isState() {
return state;
} public void setState(boolean state) { this.state = state;
} public synchronized void setData(String data) {
System.out.println("执行了");
this.notify();//不释放锁 执行完毕释放锁
this.state=true;
this.data = data;
} }

  

public class RequestUtils{

    public static SimpleReusltData  get(String url) {
final SimpleReusltData simpleReusltData=new SimpleReusltData();
new Thread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub try {
//模拟执行http耗时操作
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
simpleReusltData.setData("数据");
}
}).start(); return simpleReusltData; }
public static void main(String[] args) throws InterruptedException {
SimpleReusltData simpleReusltData=RequestUtils.get("url");
System.out.println(simpleReusltData.getData());
}
}

调用getData 方法如果没有setData 则state是false 则释放锁 加入到等待队列   当你get方法线程加载完数据再setData 执行完毕释放锁 唤醒等待队列

Future和Callable的使用的更多相关文章

  1. java多线程Future和Callable类的解释与使用

    一,描写叙述 ​在多线程下编程的时候.大家可能会遇到一种需求,就是我想在我开启的线程都结束时,同一时候获取每一个线程中返回的数据然后再做统一处理,在这种需求下,Future与Callable的组合就派 ...

  2. Future、Callable 、FutureTask详解

    1.Future和Callable Future是一个接口表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果.Future提供了get().cancel().isC ...

  3. 【Java并发核心五】Future 和 Callable

    默认情况下,线程Thread对象不具有返回值的功能,如果在需要取得返回值的情况下会极为不方便.jdk1.5中可以使用Future 和 Callable 来获取线程返回值. Callable 可以 看成 ...

  4. java并发之Future与Callable使用

    java并发之Future与Callable使用 这篇文章需要大家知道线程.线程池的知识,尤其是线程池. 有的时候我们要获取线程的执行结果,这个时候就需要用到Callable.Future.Futur ...

  5. Java并发编程 - Runnbale、Future、Callable 你不知道的那点事(二)

    Java并发编程 - Runnbale.Future.Callable 你不知道的那点事(一)大致说明了一下 Runnable.Future.Callable 接口之间的关系,也说明了一些内部常用的方 ...

  6. Java并发编程 - Runnbale、Future、Callable 你不知道的那点事(一)

    从事Java开发已经快两年了,都说Java并发编程比较难,比较重要,关键面试必问,但是在我的日常开发过程中,还真的没有过多的用到过并发编程:这不疫情嘛,周末不能瞎逛,就看看师傅们常说的 Runnabl ...

  7. Java并发编程核心方法与框架-Future和Callable的使用

    Callable接口与Runnable接口对比的主要优点是Callable接口可以通过Future获取返回值.但是Future接口调用get()方法取得结果时是阻塞的,如果调用Future对象的get ...

  8. Future FutrueTask Callable类源码说明以及原理使用

    1.Future Callable FutureTask 源码说明 JDK内置的Future主要使用到了Callable接口和FutureTask类. Callable是类似于Runnable的接口, ...

  9. 并发编程中Future和Callable使用

    Future模式非常适合在处理很耗时很长的业务逻辑时进行使用,可以有效的减少系统的响应时间,提高系统的吞吐量. 看一个小的demo: 看一下执行结果: 这是异步去获取结果的示例,在子线程去处理任务的时 ...

  10. java 线程Thread 技术--1.5 Future与Callable

    Callable: 从官方文档说起: 通过实现callable 的called 方法可以使一个任务可以返回一个结果以及可能抛出一个异常: callable 与runnable 是相似的,可以被其他线程 ...

随机推荐

  1. 表现与数据分离;前台MVC

    无意间看到一个web前端招聘要求:表现与数据分离 这名词对我非常陌生,我就去百度了下 由于有各种莫名其妙的需求,所以才会出现我们前端MVC这样的莫名其妙的东西... 我们的html就是model,我们 ...

  2. 转:Java 计算2个时间相差多少年,多少个月,多少天的几种方式

    日期比较对象 DayCompare 代码用到了  lombok ,如果不用,其实就是把getter / setter方法自己写一遍,还有构造方法. @Data @Builder public stat ...

  3. Entity Framework Utility .ttinclude File

    https://msdn.microsoft.com/en-us/library/ff477603(v=vs.100).aspx This topic provides an overview of ...

  4. 检测含有挖矿脚本的WiFi热点——果然是天下没有免费的午餐

    见:http://www.freebuf.com/articles/web/161010.html 本质上是在开放wifi热点,自己搭建挖掘的网页,让接入的人访问该网页. 802.11无线协议本身特点 ...

  5. P3959 宝藏 模拟退火。。。

    竟然模拟退火能做!我就直接抄代码了,我加了点注释. 题干: 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nn 个深埋在地下的宝藏屋, 也给出了这 nn 个宝藏屋之间可供开发的 mm ...

  6. TCP打开文件传输(服务器端并发code)

    #include <stdio.h>#include <stdlib.h>#include <arpa/inet.h>#include <sys/types. ...

  7. springMVC返回数据的四种方式

    转自:https://blog.csdn.net/itcats_cn/article/details/82119673 springMVC返回数据的四种方式:第一种,通过request.setAttr ...

  8. codevs1253 超级市场(dp)

    1253 超级市场  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 某人喜欢按照自己的规则去市场买菜,他每天 ...

  9. (转载) ORA-12537:TNS连接已关闭

    今天在远程客户端配置EBS数据库连接的时候发生“ORA-12537:TNS连接已关闭”的错误.进入服务器运行如下命令:$tnsping VIS 这里VIS如果定义服务名,可以写成 $ tnsping ...

  10. asp.net ajax 简单案例

    第一步先引用 scriptManager <asp:UpdatePanel ID="UpdatePanelGuanZhu" runat="server"& ...