• Future设计模式


     Future设计模式把同步调用变成异步调用

    //表示一个可能还没有完成的异步任务的结果,直接返回给调用者
    public interface Future<T> {
    
        T get() throws InterruptedException;
    
    }
    //Future具体的实现
    public class AsynFuture<T> implements Future<T> {
    
        private volatile boolean done = false;
    
        private T result;
    
        public void done(T result) {
            synchronized (this) {
                this.result = result;
                this.done = true;
                this.notifyAll();
            }
        }
    
        @Override
        public T get() throws InterruptedException {
            synchronized (this) {
                while (!done) {
                    this.wait();
                }
            }
            return result;
        }
    }
    //要提交的异步任务,执行逻辑由子类覆写call方法
    public interface FutureTask<T> {
    
        T call();
    }
    //桥接Future和FutureTask
    public class FutureService {
    
        //调用者通过Future来获取结果
        public <T> Future<T> submit(final FutureTask<T> task) {
            AsynFuture<T> asynFuture = new AsynFuture<>();
            new Thread(() -> {
                T result = task.call();
                asynFuture.done(result);
            }).start();
            return asynFuture;
        }
    
      //调用者通过Future来获取结果或者由回调函数来处理
        public <T> Future<T> submit(final FutureTask<T> task, final Consumer<T> consumer) {
            AsynFuture<T> asynFuture = new AsynFuture<>();
            new Thread(() -> {
                T result = task.call();
                asynFuture.done(result);
                consumer.accept(result);
            }).start();
            return asynFuture;
        }
    }
    public class Client {
    
        public static void main(String[] args) throws InterruptedException {
    
            FutureService futureService = new FutureService();
            //通过回调函数通知调用者
    //        futureService.submit(() -> {
    //            try {
    //                Thread.sleep(10000L);
    //            } catch (InterruptedException e) {
    //                e.printStackTrace();
    //            }
    //            return "FINISH";
    //        }, System.out::println);
    
            //调用者主动获取结果,可能会发生阻塞
            Future<String> future = futureService.submit(()->{
                try {
                    Thread.sleep(5000L);
                }catch(Exception e) {
                    e.printStackTrace();
                }
                return "ABC";
            });
            
            System.out.println("===========");
            Thread.sleep(2000);
            System.out.println("######## "+future.get());
        }
    }

     

  • 相关阅读:
    Unity 摄像机旋转跟随缩放控制
    Unity 协程深入解析与原理
    好看的滚动条
    ES6编译问题SyntaxError: Unexpected token import
    Axure rp8 注册码,亲测可以用! 可用给个赞呗!!
    angular 项目中遇到rxjs error TS1005:';'
    window 查看端口 杀端口
    angular 中嵌套 iframe 报错
    js 快速生成数组的方法
    ng-packagr 不能全部打包文件
  • 原文地址:https://www.cnblogs.com/moris5013/p/10917120.html
Copyright © 2020-2023  润新知