0
点赞
收藏
分享

微信扫一扫

Java中的Future模式

萍儿的小确幸 2021-09-28 阅读 60
码哥

Future模式

FutureTask 常用API
  • boolean cancel(boolean mayInterruptIfRunning)
  • boolean isDone()
  • boolean isCancelled()
  • 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

举报

相关推荐

0 条评论