Future和Callable的使用
应用场景
财务成本核算。可能会有多个耗时的步骤。如果顺序执行是非常慢的。再相互数据获取数据不依赖的情况下可以使用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的使用的更多相关文章
- java多线程Future和Callable类的解释与使用
一,描写叙述 在多线程下编程的时候.大家可能会遇到一种需求,就是我想在我开启的线程都结束时,同一时候获取每一个线程中返回的数据然后再做统一处理,在这种需求下,Future与Callable的组合就派 ...
- Future、Callable 、FutureTask详解
1.Future和Callable Future是一个接口表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果.Future提供了get().cancel().isC ...
- 【Java并发核心五】Future 和 Callable
默认情况下,线程Thread对象不具有返回值的功能,如果在需要取得返回值的情况下会极为不方便.jdk1.5中可以使用Future 和 Callable 来获取线程返回值. Callable 可以 看成 ...
- java并发之Future与Callable使用
java并发之Future与Callable使用 这篇文章需要大家知道线程.线程池的知识,尤其是线程池. 有的时候我们要获取线程的执行结果,这个时候就需要用到Callable.Future.Futur ...
- Java并发编程 - Runnbale、Future、Callable 你不知道的那点事(二)
Java并发编程 - Runnbale.Future.Callable 你不知道的那点事(一)大致说明了一下 Runnable.Future.Callable 接口之间的关系,也说明了一些内部常用的方 ...
- Java并发编程 - Runnbale、Future、Callable 你不知道的那点事(一)
从事Java开发已经快两年了,都说Java并发编程比较难,比较重要,关键面试必问,但是在我的日常开发过程中,还真的没有过多的用到过并发编程:这不疫情嘛,周末不能瞎逛,就看看师傅们常说的 Runnabl ...
- Java并发编程核心方法与框架-Future和Callable的使用
Callable接口与Runnable接口对比的主要优点是Callable接口可以通过Future获取返回值.但是Future接口调用get()方法取得结果时是阻塞的,如果调用Future对象的get ...
- Future FutrueTask Callable类源码说明以及原理使用
1.Future Callable FutureTask 源码说明 JDK内置的Future主要使用到了Callable接口和FutureTask类. Callable是类似于Runnable的接口, ...
- 并发编程中Future和Callable使用
Future模式非常适合在处理很耗时很长的业务逻辑时进行使用,可以有效的减少系统的响应时间,提高系统的吞吐量. 看一个小的demo: 看一下执行结果: 这是异步去获取结果的示例,在子线程去处理任务的时 ...
- java 线程Thread 技术--1.5 Future与Callable
Callable: 从官方文档说起: 通过实现callable 的called 方法可以使一个任务可以返回一个结果以及可能抛出一个异常: callable 与runnable 是相似的,可以被其他线程 ...
随机推荐
- ubuntu下eclipse连接mysql
提示:一定要保证电脑处于联网状态 我们要下载一个mysql-connector-java-5.0.8-bin.jar的东西(当然这个jar包的版本号和你的mysql版本号的关系不是非常大),放到你新建 ...
- ACM Amman Collegiate Programming Contest(7.22随机组队娱乐赛)
题目链接 https://vjudge.net/contest/240074#overview 只写一下自己做的几个题吧 /* D n^2的暴力dp怎么搞都可以的 这里先预处理 i到j的串时候合法 转 ...
- 我在SharePoint行业的从业经历(二)
本文是我的SharePoint从业经历的第二篇,第一篇请參考 我在SharePoint行业的从业经历(一) 做完那个项目之后.对SharePoint 2003有了一些认识. 可是后来几年我就没在 ...
- C# 实现DataGridView分页功能
C#实现DataGridView分页功能 2010-07-17 13:45:42| 分类: C#|字号 订阅 从界面可以看到,在设计时需要一个DataGridView.BindingNavi ...
- 2017 Multi-University Training Contest - Team 1 1002&&hdu 6034
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- P2831 愤怒的小鸟 状压dp
这个题主要是预处理比较复杂,先枚举打每只鸟用的抛物线,然后找是否有一个抛物线经过两只鸟,然后就没了. 题干: 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上 ...
- B1789 Y型项链 贪心
想明白之后就是一道大水题,就是两两把最长公共前缀求出来,然后直接取最长的,然后就直接暴力算就行了... 题干: Description 欢乐岛上众多新奇的游乐项目让小可可他们玩的非常开心.现在他们正在 ...
- 分享的js代码,从w3c上拓下来的
<!DOCTYPE html><html><head> <title></title> <script>window._bd_s ...
- selenium3 + python - select定位
一.Select模块(index) 1.导入Select模块.直接根据属性或索引定位 2.先要导入select方法:from selenium.webdriver.support.se ...
- 快速搭建ELK集中化日志管理平台
由于我们的项目是分布式,服务分布于多个服务器上,每次查看日志都要登录不同服务器查看,而且查看起来还比较麻烦,老大让搭一个集中化日志管理的东西,然后就在网上找到了这个东西ELK ELK就是elastic ...