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
