Java中的Future

提到这个Future,相信英文好的人都知道,这个单词的意思是表示未来,今天的用法也跟这个单词的意思相类似

在做开发中我们经常遇到这样一个问题,就是一个问题需要执行比较久,但是有需要等待它的结果,于是我们会使用线程来做,但是使用线程也会到一个问题,我什么时候调用呢,如果调用早了肯定会出现空指针异常的,今天我的就使用这个future来解决这个问题。

Future相当于拿到一个应用,这个引用在线程没有执行完时里面没有内容,但是获取它不报错,因此你可以持有它,一旦有线程执行完后就有数据了,相信读者听的云里雾里。

private interface Future<T>{
	//获取这个Future的引用
	T get();
	//是否执行完成
	boolean isFinish()
}

private interface Callable<T>{
//这个方法执行完之后返回的是一个T类型的对象
T action();
}


private static <T> Future<T> invoke(Callable<T> callable){
  AtomicReference<T> result = new AtomicReference<>();
  AtomicBoolean isDown = new AtomicBoolean(false);
	//开启线程
	Thread t = new Thread(()->{
	//	这个action相当于是用户传递的函数,执行完后返回一个T
	 T value = callable.action();
	 result.set(value);
	 isDown.set(true);
	});	
	//创建一个Future
	Future<T> future = new Future<T>(){
	//需要实现两个接口
	          @Override
          public T get() {
			//通过这个接口将结果返回去	
              return result.get();
          }

          @Override
          public boolean isFinish() {
          //这个接口表明数据已经传递过去了
              return isDown.get();
          }
	}
	return future;
}


    public static void main(String[] args) throws InterruptedException {
//        testmapping();
        Future<String> tFuture = invoke(() -> {
            try {
                Thread.sleep(5000);
                return "I am finished";
            } catch (InterruptedException e) {
                return "error";
            }
        });
        System.out.println(tFuture.get());
        System.out.println(tFuture.get());
        System.out.println(tFuture.get());
        System.out.println(tFuture.get());
        while (!tFuture.isFinish()){
            Thread.sleep(100);
        }
        System.out.println(tFuture.get());
        }
/*打印的结果,当有数据的时候就可以使用了
null
null
null
null
I am finished
*/

你可能感兴趣的:(java)