CompletionService API的使用

CompletionService是一个接口,用于异步处理任务并按完成顺序获取结果,缓解Future可能导致的线程阻塞问题。它提供了take()和poll()方法来获取已完成的任务,避免阻塞。测试结果显示,take()在没有完成任务时会阻塞,而poll()和poll(long, TimeUnit)则不会。在处理异常时,只有调用get()方法时才会抛出异常。" 81866878,6522153,Win10环境下配置Anaconda与右键菜单添加Jupyter,"['Anaconda', 'Python', 'Windows', '环境配置', 'Jupyter']
摘要由CSDN通过智能技术生成

CompletionService 介绍

接口CompletionService 是以异步的方式一边产生新任务,一边处理完成的任务结果,可以将任务执行和任务处理分离开,使用submit()执行任务,task()取得已完成的任务,并按照任务的时间顺序处理结果。

使用CompletionService 解决Future阻塞的问题
Future take() throws InterruptedException ;方法会先将执行完的任务Future对象返回,这样可以部分优化Future的线程阻塞问题,但是接口中存在没有执行完的任务则cs.take().get()还是会阻塞线程。

public class MyCallable implements Callable<String> {
   

	private String name;
	private long sleepValue;
	
	public MyCallable(String name, long sleepValue) {
   
		super();
		this.name = name;
		this.sleepValue = sleepValue;
	}

	@Override
	public String call() throws Exception {
   
	System.out.println(name);
	Thread.sleep(sleepValue);
		return "result call "+name;
	}

}

public static void main(String[] args) {
   
		MyCallable call1 = new MyCallable("任务1", 4000);
		MyCallable call2 = new MyCallable("任务2", 3000);
		MyCallable call3 = new MyCallable("任务3", 2000);
		List<Callable> list = new ArrayList<Callable>();
		list.add(call1);
		list.add(call2);
		list.add(call3);
		ThreadPoolExecutor poll = new ThreadPoolExecutor(5, 7, 5, TimeUnit.SECONDS, new LinkedBlockingDeque());
		CompletionService cs = new ExecutorCompletionService(poll);
		list.forEach(m -> {
   
			cs.submit(m);
		});
		try {
   
			for (int i = 0; i < list.size(); i++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值