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

posted @   意犹未尽  阅读(988)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示