码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-03-23 22:20:24      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:实现   log   如何   使用方法   组合   类型   类的使用   就是   logs   

前言

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组件拓展

标签:实现   log   如何   使用方法   组合   类型   类的使用   就是   logs   

原文地址:https://www.cnblogs.com/jmy520/p/12555343.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!