Java多线程:使用 CompletionService 接口避免 Future 的阻塞

本文介绍Java的CompletionService接口,用于解决Future.get()方法导致的阻塞问题。通过ExecutorCompletionService实现,它能同时处理任务执行和结果处理,按任务完成顺序返回结果。讲解了submit、take、poll等方法的使用,并提供了一个案例展示take方法返回结果的顺序。
摘要由CSDN通过智能技术生成

在这里插入图片描述

01 CompletionService 简介

在上一篇内容中,介绍了 Future 的使用,其中也涉及到了 Future 的不足,就是当通过 get() 方法获取线程的返回值的时候,会导致阻塞,由于阻塞很多时候这回倒置性能问题。而 JDK 中提供的另外一个工具类能够帮助我们缓解或是解决阻塞的问题。

CompletionService 的作用:

CompletionService 接口解决 Future 阻塞的问题。Completion 的实现类有 ExecutorCompletionService。

CompletionService 实现内能够一边处理 submit 的线程的任务,一边处理已完成任务的结果。这样就可以将执行任务与处理任务分离开来进行处理。

使用 submit() 执行任务,使用 take()取得已完成的任务(Future),并按照完成这些任务的时间顺序处理它们的结果。

02 常用方法
  • submit(Runnable task, V result) 作用是来执行线程任务。
  • take() 作用是获取先完成任务的 Future 对象,take()获取到的 Future 对象在调用 get()方法的时候还是呈现阻塞特性。
  • poll() 作用是获取并移除表示下一个已完成任务的 Future,如果不存在这样的任务,则返回 null,poll() 方法没有阻塞效果。
  • poll(long timeout, TimeUnit unti) 作用是等待指定的时间(timeout + unti),如果在 timeout 时间内获得值时立即向下继续执行,如果超过时也立即向下执行。
  • 异常处理。在某个线程内抛出异常,如果只是通过 take() 方法获取到 Future 对象,那么无法在 console 中得到相关的异常信息。只有调用 Future 对象的 get() 方法才能获得异常栈信息。
03 案例

下面是一个例子,用来演示,take()方法返回的顺序是按照执行玩的先后顺序。

Worker.java

public class Worker implements Callable<String> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值