Callable和Future

Author Avatar
lucky 2020年01月15日
  • 在其它设备中阅读本文章

Callable 和 Runnable 很类似,主要区别在于 Callable 能返回运行结果,能抛出异常。
执行 Callable 方式,需要 Future 的实现类的支持,用于接收运算结果。FutureTask 是 Future 接口的实现类。

    public class TestCallable {
  
    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
  
        //1.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。
        //参数里面放一个Callable的对象
        FutureTask<Integer> result = new FutureTask<>(td);
  
        new Thread(result).start();
  
        //2.接收线程运算后的结果
        try {
            Integer sum = result.get();  //FutureTask 可用于 闭锁 类似于CountDownLatch的作用,在所有的线程没有执行完成之后这里是不会执行的
            System.out.println(sum);
            System.out.println("------------------------------------");
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
  
}
  
class ThreadDemo implements Callable<Integer> {
  
    @Override
    public Integer call() throws Exception {
        int sum = 0;
  
        for (int i = 0; i <= 100000; i++) {
            sum += i;
        }
  
        return sum;
    }
  
}

综上例子可以看到: Callable 和 Future 接口的区别

(1)Callable 规定的方法是 call(),而 Runnable 规定的方法是 run().
(2)Callable 的任务执行后可返回值,而 Runnable 的任务是不能返回值的。
(3)call() 方法可抛出异常,而 run()方法是不能抛出异常的。
(4)运行 Callable 任务可拿到一个 Future 对象, Future 表示异步计算的结果。
它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
通过 Future 对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
Callable 是类似于 Runnable 的接口,实现 Callable 接口的类和实现 Runnable 的类都是可被其它线程执行的任务。

https://www.cnblogs.com/wzdnwyyu/p/11162973.html

评论已关闭