Java高併發編程(9)

future模式

  • 首先,需要一個Future接口,用以獲取值
public interface Future<T> {
    T get();
}
  • 然後,需要一個FutureTask接口,用以定義返回值的方法
public interface FutureTask<T> {
    T call();
}
  • 再然後,需要一個FutureService,粘合Future和FutureTask
public class FutureService<T> {

    public Future<T> submit(FutureTask<T> task){
        FutureImp<T> future = new FutureImp<>();
        new Thread(()->{
            T date = task.call();
            System.out.println("get value");
            future.setDate(date);
        }).start();
        return future;
    }
}
  • 最後,需要一個Future的實現類
public class FutureImp<T> implements Future<T> {

    private T date;

    private volatile boolean finish = false;

    public void setDate(T date){
        synchronized (this){
            this.date = date;
            finish = true;
            notifyAll();
        }
    }

    @Override
    public T get() {
        synchronized (this){
            while (!finish){
                try {
                    wait();
                } catch (InterruptedException e) {
                    continue;
                }
            }
        }
        return date;
    }
}

例子

public class Demo {

    public static void main(String[] args) {
        FutureTask<String> futureTask = ()->{
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "OK";
        };

        FutureService<String> fs = new FutureService<>();
        Future<String> submit = fs.submit(futureTask);
        System.out.println("get back value soon");
        System.out.println(submit.get());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章