前言
J.U.C的拓展组件有哪些?分别在什么场景下使用?如何使用?
主体概要
- J.U.C-FutureTask
- J.U.C-ForkJoin
- J.U.C-ForkJoin
主体内容
一、J.U.C-FutureTask
1.这里要介绍的第一个组件是FutureTask,这个组件是J.U.C里面的,但它不是AQS的子类。这个类对线程结果的处理值得我们去学习。在学习Java多线程的时候,一定接触过Thread,Runnable,一种是直接继承Thread,另一种就是实现Runnable,这两种方式有个共同的缺陷,那就是无法获得线程执行的结果。从Java1.5开始就提供了Callable、Future,通过他们可以在任务执行完毕之后得到任务执行的结果。以下将介绍Callable、Future、FutureTask三个类的使用方法。
2.Callable和Runnable接口对比。
(1)Runnable很简单,只有一个run()方法,任务在run中执行即可。
(2)Callable是一个泛型的接口,它里面有一个call()函数,call函数返回类型就是我们传进去的类型。Callable功能比Runnable更强大些,主要是其执行完毕有返回值,并且能够抛出异常。
3.Future接口。
对于我们具体的Runnable或者Callable的一个任务,他可以进行取消,查询的任务是否被取消,查询是否完成以及获取结果等等。通常线程都是异步进行的,所以不可能从别的线程中直接获得方法的返回值,这个时候Future就有作用了,Future可以监听目标线程调用call的情况,当调用Future的get方法是时候,就可以获得它的结果。通常这个时候线程可能不会直接完成,当前线程就开始阻塞,直到call方法结束,返回出结果,线程才继续执行。总结出一句话:Future它可以得到别的线程任务方法的返回值。
4.FutureTask类。
FutureTask类它的父类是RunnableFuture,而RunnableFuture继承了Runnable和Future这两个接口。由此可见,FutureTask也是执行callable类型的任务,如果构造函数参数是Runnable的话,他会转换成Callable类型。FutureTask实现了两个接口:Runnable和Future,所以它即可以作为Runnable,被线程执行,又可以作为Future,得到Callable的返回值。那么这个组合的使用有什么好处呢?假设有一个很费时的逻辑,需要计算并且返回出值,同时这个值又不是马上就需要得到,那么就可以使用这个组合。用另外一个线程获取返回值,而这个线程就可以在返回值出来之前做其他的操作,等到需要这个返回值的时候,再通过Future得到。
二、J.U.C-ForkJoin
三、J.U.C-ForkJoin
待续...
总结
原文地址:https://www.cnblogs.com/jmy520/p/12555343.html