Future模式(凭据模式)

此种方式将Future与Task分离开来。导致finish()方法暴露出来。被外部调用。更优的方式将Future与Task结合起来。参考JDK FutureTask类

不便于管理。

如果要实现Cancle,参考FutureTask在内部将callback与future分离开来的设计

public interface Future<T>{

    //获取返回值

    T get() throws InterruptedException;

    //查看是否结束

    boolean done();

}

public interface FutureService<IN,OUT>{

    Future<?> submit(Runnable r);

    

    Future<OUT> sunmit(Task<IN,OUT> task,In input);



    static <T,R> FutureService<T,R> newService(){

        return new FutureServiceImpl();

    }

}





public class FutureTask<T> implements Future<T>{

    private T result;

    private boolean isDone = false;

    private final Object Lock= new Object;



    public T get() throws InterruptedException{

        synchronized(LOCK){

            while(!isDone){

                Lock.wait();

            }

        }

        return result;

    }



    protected void finish(T result){

        synchronized(LOCK){

            if(isDone){

                return;

            }

            this.result = result;

            this.isDone = true;

            LOCK.notifyAll();

        }

    }



    public boolean done(){

        return isDone;

    }

}



public class FutureServiceImpl<IN,OUT> implements FutureService<IN,OUT>{



    public Future<?> submit(Runnable r){

        final FutureTask<void> futrure = new FutureTask<>();

        new Thread(()——>{

            r.run();

            future.finish(null);

            }

        ).start();

        return futrure;

    }



    public Future<OUT> submit<Task<IN,OUT> task,IN input,Callback<OUT> callback){

        final FutureTask<OUT> futrure = new FutureTask<>();

        new Thread(() ——>{

          OUT result = task.get(input);

          future.finish(result);

          if(callback != null){

                callback.call(result);

            }

        }).start();

        return future;

    }

}
发布了115 篇原创文章 · 获赞 57 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_35211818/article/details/104186643