java 异步调用 Future以及FutureTask浅入浅出

java 异步调用Future以及FutureTask知多少?

在某些时候,我们希望一个线程执行完某个任务之后,能够给我们返回某些我们想要的数据,在Future中就能实现这样的一个功能,触发哪些潜在不叫好事的操作,把调用线程给解放出来,,让线程能够继续执行有价值的工作,Future使用的范围还是很广的无论是Stream包,还是JUC,都有很多类实现了Future,

Future的使用其实也很简单,看看一下的接口,

public interface Future<V> {
   
    /**
     * 尝试去取消这个执行的线程任务,但是如果这个执行任务已经结束了,那么取消就会失败
     * 后期如果直接get,程序就会抛出CancellationException
     */
    boolean cancel(boolean mayInterruptIfRunning);
    /**
     * 当任务在在正常完成之前如果执行了cancel(),那么就返回true,否则返回false
     */
    boolean isCancelled();
    /**
     * 查看当前任务是否已完成,如果当前任务已经取消,也是会返回已完成
     */
    boolean isDone();
    /**
     *等待线程执行完成之后获取我们需要的结果
     */
    V get() throws InterruptedException, ExecutionException;
    /**
     * 一般我们不建议使用上面方式,如果这个计算的线程一直阻塞住了,我们不可能一直等待,
     * 这个方法指定一个等待的时间,那如果超时还没有获取到结果就会抛出一个TimeoutException异* 常
     */
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

这些接口既能取消一个线程的执行,也能查看线程是否已经被取消等等

在项目中使用Future更常见的也就是FutureTask, ExecutorService中的submit就是创建的FutureTask,我们先来看一个自己实现的FutureTask小例子


    public  void test1() {
   
        Callable<String > callable = () -> {
   
            Thread.sleep(2000);
            return "TEST";
        };
        FutureTask<String> future = new FutureTask<>(callable);
   
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值