多线程-- 九.J.U.C之扩展组件

扩展组件:

 

1.Callable接口,Future接口,FutureTask类

    它不是AQS的子类,不过它对线程结果的处理很好。

    之前创建线程,有两种方式,一个是Thread,一个是Runnable接口。这两种方式有一个共同的缺点,就是在执行完任务之后,无法获取执行结果。从java1.5之后,就提供了Callable接口和Future接口,它可以在任务执行完毕之后得到结果。在线程执行后,可以有返回值。

    Future可以监视目标线程调用情况。可以得到别的线程任务方法的返回值。

    Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。 

  也就是说Future提供了三种功能:

  1)判断任务是否完成;

  2)能够中断任务;

  3)能够获取任务执行结果。

  因为Future只是一个接口,所以是无法直接用来创建对象使用的,因此就有了FutureTask。FutureTask类实现了两个接口:Callable和Future。

 

代码演示:Future

      

 

 

代码演示:FutureTask

 

 



 

2.Fork/Join 框架

    Fork/Join框架是Java7提供的一个用于并行执行任务的框架,它是一个把大任务分割成若干个小任务,最终汇总每个小任务的结果后,得到大任务结果的框架。思想和Map/Reduce非常类似。主要采用的是工作窃取算法。

    假如,我们需要做一个比较大的任务,我们可以把这个大任务分割成若干个互补依赖的子任务。为了减少线程间的竞争,于是把这些子任务分别放到不同的队列里,为每个队列创建一个单独的线程来执行线程里面的任务,线程与队列一一对应。比如A线程负责处理A队列里的任务,但是有的线程会先把自己队列里的任务处理完,而其它线程对应的队列里还有其它任务等待处理,干完活的线程也不能在那干等着啊,还不如帮其它线程干活。于是它就去其它线程的队列里窃取任务来执行,而在这时他们会访问同一个队列。所以呢,为了减少窃取任务线程和被窃取任务线程之间的竞争,通常采用双端队列。被窃取任务的线程,永远从双端队列的头部拿任务执行;而窃取任务的线程永远从双端队列的尾部窃取任务执行。

    这个工作窃取算法的优点,就是充分利用线程进行并行计算,并减少了线程间的竞争;缺点就是有时候也会出现竞争,例如队列里只有一个任务,并且同时这样还消耗了更多的系统资源。

    Fork/Join框架核心是两个类:ForkJoinPool和ForkJoinTask。    

    ForkJoinPool负责做实现,包括工作窃取算法,它管理工作线程和提供关于任务的状态和它们的执行信息。

    ForkJoinTask主要提供在任务中执行Fork和Join操作的机制。

 


 


 

3.BlockingQueue

    BlockingQueue接口就是阻塞队列,在某些情况下对阻塞队列操作会造成阻塞。

    大体是两种情况,一种是线程对队列满了的时候,进行入队列操作;一种是队列空了的时候,进行出队列的操作。会造成阻塞。

    BlockingQueue的几个实现类:ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值