并发与高并发(十四)J.U.C组件拓展

Posted jmy520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发与高并发(十四)J.U.C组件拓展相关的知识,希望对你有一定的参考价值。

前言

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

 

待续...

总结

以上是关于并发与高并发(十四)J.U.C组件拓展的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程- J.U.C组件拓展

J.U.C并发框架源码阅读(十四)ScheduledThreadPoolExecutor

Java并发编程与高并发解决方案

Java多线程与高并发:高并发解决思路

并发与高并发-并发模拟代码

Java并发编程与高并发解决方案