Future和Callable的使用
Posted 意犹未尽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的使用的主要内容,如果未能解决你的问题,请参考以下文章