并发编程-Future 与 FutureTask

Future

FutureTask叫未来任务,可以将一个复杂的任务剔除出去交给另外一个线程来完成。

Future类提供了下面这些方法:
1 get()
get方法的行为取决于Callable任务的状态,只有以下5种情况:

  • 任务正常完成:get方法会立刻返回结果
  • 任务尚未完成:任务还没有开始或进行中,get将阻塞并直到任务完成。
  • 任务执行过程中抛出Exception:get方法会抛出ExecutionException,这里抛出异常,是call()执行
    时产生的那个异常
  • 任务被取消:get方法会抛出CancellationException
  • 任务超时:get方法有一个重写方法,是传入一个延迟时间的,如果时间到了还没有获得结果,get方法会抛出TimeoutException

2 get(long timeout,TimeUnit unit)
如果call()在规定时间内完成任务,那么就会正常获取到返回值,而如果在指定时间内没有计算出结果,则会抛出TimeoutException

3 cancel()

  • 如果这个任务还没有开始执行,任务会被正常取消,未来也不会被执行,返回true
  • 如果任务已经完成或已经取消,则cancel()方法会执行失败,方法返回false
  • 如果这个任务已经开始,这个取消方法将不会直接取消该任务,而是会根据参数
  • mayInterruptIfRunningg来做判断。如果是true,就会发出中断信号给这个任务。
    4 isDone()
  • 判断线程是否执行完,执行完并不代表执行成功。
    5 isCancelled()
  • 判断是否被取消

举个例子
异步执行,获取结果

public class DemoTask {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService sv = Executors.newCachedThreadPool();
        Future<String> submit = sv.submit(new CallAbleTask());
        submit.get();
        System.out.println("拿到结果以后继续执行");
        sv.shutdown();
    }
    static class CallAbleTask implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("异步执行");
            Thread.sleep(1000);
            return "jia you";
        }
    }
}

获取结果,任务超时

public class DemoTask {

    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
        ExecutorService sv = Executors.newCachedThreadPool();
        Future<String> submit = sv.submit(new CallAbleTask());
        try {
            submit.get(1, TimeUnit.SECONDS);
            System.out.println("拿到结果以后继续执行");
        } catch (Exception e) {
            System.out.println("任务超时");
        } finally {
            sv.shutdown();
        }
    }
    static class CallAbleTask implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("异步执行");
            Thread.sleep(2000);
            return "jia you";
        }
    }
}

FutureTask

Future是一个接口,FutureTask是一个实现类。

public class DemoTask {
    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
        ExecutorService sv = Executors.newCachedThreadPool();
        // 这个时候不需要 返回的Future了
        FutureTask<String> futureTask = new FutureTask<>(new CallAbleTask());
        sv.submit(new CallAbleTask());
        try {
            futureTask.get(1, TimeUnit.SECONDS);
            System.out.println("拿到结果以后继续执行");
        } catch (Exception e) {
            System.out.println("任务超时");
        } finally {
            sv.shutdown();
        }
    }
    static class CallAbleTask implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("异步执行");
            Thread.sleep(2000);
            return "jia you";
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值