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 执行完毕释放锁 唤醒等待队列

  • 相关阅读:
    synchronized 关键字
    synchronized 关键字
    Linux IPC之共享内存
    链表的插入、删除
    链式队列的实现
    链栈的实现
    双色、三色排序问题
    memmove、memcpy、strcpy、memset的实现
    字符串中去掉多余的空格
    华为机试:从一个数组中选取不同的数(均小于10)组成一个最大的三位数
  • 原文地址:https://www.cnblogs.com/LQBlog/p/8983255.html
Copyright © 2011-2022 走看看