1、Callable接口是什么?
是java.util.concurrent包下的一个函数式接口,用来创建线程的。返回结果是一个任务,并可能抛出异常。
2、Callable接口和Runnable的区别呢?
Callable可以有返回值,可以抛出异常,而Runnable正好相反
Callable方法时call,而Runnable方法时run
3、FutureTask类
api文档翻译如下:
一个可以取消的异步计算的类。这个类提供了 Future基实现,用的方法启动和取消计算,查询是否计算完成,并检索结果。结果只能检索时,计算已完成的 get方法将阻塞;如果计算尚未完成。一旦计算完成,计算不能重新启动或取消(除非计算时使用 runAndReset())。
一个FutureTask可以用来包装Callable或Runnable对象。因为FutureTask实现Runnable,一FutureTask可以提交执行Executor。
异步调用,来处理一件比较消耗资源的方法,比如4个同学,A算1+20,B算21+30,C算31*到40,D算41+50,是不是C的计算量有点大啊,那么开一个线程去计算C同学的任务,然后等A/B/C 计算完成时再查询是否计算完成。这样的好处不会阻塞。
当主线程需要执行比较耗时的操作时,但又不想阻塞主线程,可以创建一个线程去执行这个操作在后台完成,当主线程需要这个线程运行的结果或执行状态时,再去获取。
一般FutureTask比较耗时,主线程完成自己的任务或需要时再去获取。计算结果仅仅在计算完成时返回,若线程获取时没有计算完成,主线程会一直等待该线程计算完成。该计算一旦完成就不会再次执行。
网友评论