Future模式
FutureTask 常用API
- boolean cancel(boolean mayInterruptIfRunning)
 
- V get() throws InterruptedException, ExecutionException
 
- V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
 
Future模式一般有两种使用方式
public class FutureDemo implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep(2000);//代替耗时的异步程序
        return "result";
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                5,
                5,
                0,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(100),
                new CustomizableThreadFactory("factoryName"),
                new ThreadPoolExecutor.DiscardPolicy()
        );
        Future<String> future = pool.submit(new FutureDemo());
        //TODO 耗时的业务
        future.get();//如果异步调用执行完了则返回,否则会阻塞
}
public class FutureDemo implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep(2000);代替耗时的异步程序
        return "result";
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> futureTask = new FutureTask<>(new FutureDemo());
        new Thread(futureTask).start();
        //直接调用FutureTask的run()方法不会开启新线程
        //达不到异步的效果,和直接调用new Thread(futureTask).run()一样
        //futureTask.run();
        //TODO 耗时的业务
        futureTask.get();
    }
}
Tips
