使用方法
public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newFixedThreadPool(2); /** * 异步执行耗时统计操作 */ Future<Integer> future = executorService.submit(new Callable<Integer>() { @Override public Integer call() throws Exception { //模拟耗时统计 Thread.sleep(5000); return 5; } }); //不用串行等待统计 先执行其他数据组装 System.out.println("组装数据1"); System.out.println("组装数据2"); //如果统计操作没有执行完则等待 Integer i= (Integer) future.get(); //统一返回结果 System.out.println("返回组装数据,耗时统计:"+i); }
我们往往都是配合线程池使用。继续往下看
<1>submit
java.util.concurrent.AbstractExecutorService#submit(java.util.concurrent.Callable<T>)
public <T> Future<T> submit(Callable<T> task) { if (task == null) throw new NullPointerException(); RunnableFuture<T> ftask = newTaskFor(task); execute(ftask); return ftask; }
java.util.concurrent.AbstractExecutorService#newTaskFor
protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) { return new FutureTask<T>(callable); }
可以发现我们最终返的FutureTask
类图
可以看到FutureTask实现了Runnable
RunnableFuture接口定义
/** * runnable和Future都需要具体实现类实现 * @param <V> */ public interface RunnableFuture<V> extends Runnable, Future<V> { void run();
Future接口定义
public interface Future<V> { /** * 取消当前的Future。会唤醒所有等待结果值的线程,抛出CancellationException异常 * @param mayInterruptIfRunning 是否中断 计算结果值的那个线程 * @return 返回true表示取消成功 */ boolean cancel(boolean mayInterruptIfRunning); // 当前的Future是否被取消,返回true表示已取消。 boolean isCancelled(); // 当前Future是否已结束。包括运行完成、抛出异常以及取消,都表示当前Future已结束 boolean isDone(); // 获取Future的结果值。如果当前Future还没有结束,那么当前线程就等待, // 直到Future运行结束,那么会唤醒等待结果值的线程的。 V get() throws InterruptedException, ExecutionException; // 获取Future的结果值。与get()相比较多了允许设置超时时间。 V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
Callable接口定义
public interface Callable<V> { /** * 与runable不同的是增加了返回值 * * @return computed result * @throws Exception if unable to compute a result */ V call() throws Exception; }