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

猜你喜欢

转载自www.cnblogs.com/LQBlog/p/8983255.html