zoukankan      html  css  js  c++  java
  • 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 执行完毕释放锁 唤醒等待队列

  • 相关阅读:
    从体制内的国家干部转变为自由职业者-2017年总结
    为什么选择Django?
    Django contrib Comments 评论模块详解
    Django 2.0 新特性 抢先看!
    Python 为何能坐稳 AI 时代头牌语言
    为什么说Python 是大数据全栈式开发语言
    继承中的构造方法
    super关键字
    方法的重写
    类的继承与访问控制
  • 原文地址:https://www.cnblogs.com/LQBlog/p/8983255.html
Copyright © 2011-2022 走看看