Future

101 阅读1分钟

Future

Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。 Future类位于java.util.concurrent包下,它是一个接口:

public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}


future重要的五个方法

  • cancel()
  • isCancelled()
  • isDone()
  • get()
  • get(Long timeour,TimeUnit unit) 注意:get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;

future的实现类FutureTask

由于Future是一个接口,所以需要实现类,他的实现类就是FutureTask

例子

package demo3;

import java.util.concurrent.*;

public class CallableThread implements Callable<String> {

    @Override
    public String call() throws Exception {
        System.out.println("执行并返回参数");
        Thread.sleep(10000);
        return "123";
    }

    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newCachedThreadPool();
        CallableThread callable = new CallableThread();
        FutureTask<String> futureTask = new FutureTask<String>(callable);
        executor.execute(futureTask);
        while (true) {
            try {
                if (futureTask.isDone()) {
                    System.out.println("任务执行完成");
                    executor.shutdown();//关闭线程池
                    return;
                }
//            等待获取数据
//            if(!futureTask.isDone()){
//                System.out.println(futureTask.get());
//            }
                String str = futureTask.get(12000L, TimeUnit.MILLISECONDS);
                if (str != null) {
                    System.out.println(str);
                }
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
            }
        }
    }
}