我是靠谱客的博主 傻傻水蜜桃,最近开发中收集的这篇文章主要介绍【Java多线程与并发库】9.Callable与Future的应用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Callable&Future
它们的作用是,我们启动一个线程,线程结束的时候会返回一个结果,
我们可以通过Callable启动一个带返回数据的线程,
通过Future获取线程返回的结果。


例子:

package cn.edu.hpu.test;


import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;


public class CallableAndFuture {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		//创建一个单一线程池(只有一个线程)
		ExecutorService threadPool=Executors.newSingleThreadExecutor();
		
		//这里我们如果不需要线程返回结果,我们使用threadPool.execute(command);
		//如果我们需要线程返回结果,就使用submit(Callable<T> task)方法
		//我们使用future来拿到线程执行后的结果。
		Future<String> future = threadPool.submit(new Callable<String>(){
			public String call() throws Exception {
				Thread.sleep(2000);//睡2秒
				return "HelloWorld";
			}
		});
		System.out.println("等待结果...");
		System.out.println("线程执行后的结果为:"+future.get());
	}
}

结果:


我们上面使用threadPool.submit(Callable<T> task)方法创建了一个带有返回参数的线程,
然后使用Future<T>拿到我们的线程返回的结果。

上面的例子有一个不好的地方,就是如果有多个线程,就要有多个Future对象和多个get语句,
如果第一个get语句的线程没有结束,没有返回结果,那么该future.get()就会一直处于等待
状态,那么它后面的线程任务如果比它提前完成了,也要一直等下去,直到前面线程返回结果
了才会去获取下一个线程的结果。所以我们要实时获取最快返回结果的线程,我们可以使用下
面的方法:

a.future.get(timeout, unit)
其中timeout是等待时间,unit是时间的格式(时/分/秒/天等),也就是等待多少时间之后,
如果没有返回结果,就报超时的异常。

但不推荐使用这个方法,因为还是要停下来等待, 最后还要报错,其实是不满足我们上面
的需求的。

b.CompletionService
用于提交一组Callable任务,其take方法返回已经完成的一个Callable任务
对应的Future对象。

这就好比我们同时煎了好多食材,然后等着把熟食材盛出来,盛食材的时候,应该是
哪一个食材先熟了,则先去盛那个食材。

例子:
//固定大小的线程池,大小为10个线程
ExecutorService threadPool2 = Executors.newFixedThreadPool(10);
CompletionService<Integer> completionService 
	= new ExecutorCompletionService<Integer>(threadPool2);
//提交10个任务
for (int i = 1; i <= 10; i++) {
	final int seq=i;
	completionService.submit(new Callable<Integer>(){
		public Integer call() throws Exception {
			//休眠5秒以内随机时间
			Thread.sleep(new Random().nextInt(5000));
			return seq;
		}
	});
}
//获取刚刚提交的线程任务的结果
for (int i = 1; i <= 10; i++) {
	System.out.println(completionService.take().get());
}

结果:


completionService提交完多个任务之后,就可以等待返回结果,那个线程先返回
结果,completionService的take就get到那个结果。

转载请注明出处:http://blog.csdn.net/acmman/article/details/52891993

最后

以上就是傻傻水蜜桃为你收集整理的【Java多线程与并发库】9.Callable与Future的应用的全部内容,希望文章能够帮你解决【Java多线程与并发库】9.Callable与Future的应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(86)

评论列表共有 0 条评论

立即
投稿
返回
顶部