简单使用JDK封装好的Future模式

一般Future都是和Callable配合使用的。Future模式非常适合在处理耗时很长的业务逻辑时进行使用,可以有效旳减小系统的响应时间和提高系统的吞吐量。
1、下面看一下例子。
public class UserFuture implements Callable<String>{  //任务要实现Callable接口然后重写call方法
	private String para;
	public UserFuture(String para) {
		this.para = para;
	}
	@Override
	public String call() throws Exception {
		//模拟执行耗时
		Thread.sleep(1000 * new Random().nextInt(5));
		return para+"处理完成!";
	}
	
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		FutureTask<String> future1 = new FutureTask<String>(new UserFuture("查询1"));
		FutureTask<String> future2 = new FutureTask<String>(new UserFuture("查询2"));
		
		ExecutorService pool = Executors.newFixedThreadPool(2);
		
		Future f1 = pool.submit(future1);
		Future f2 = pool.submit(future2);
		
		//先尝试一下返回值Future的get方法,可以发现get()方法是一直阻塞着等待任务执行完再返回值
		if(f1.get()==null){
			System.out.println("任务1完成");
		}
		
		if(f2.get()==null){
			System.out.println("任务2完成");
		}
	}
}

执行结果:可以发现,等执行耗时过去了,Futrue的get()方法就会获取的null,就等于任务已经执行完了。
任务1完成
任务2完成

2、提及一下线程池的两个执行任务的方法:一个是execute方法,一个是submit方法。两个的区别:submit执行的任务可以是实现Runnable接口或者Callable接口,而execute只能执行实现Runnable接口的任务。submit有返回值Future,而execute方法没有返回值。 返回值的Future值得注意的是有一个方法是get(),如果返回是null,证明任务执行完毕。

3、下面看一下FutureTask的get()方法,它和Future的get()方法也是会一直等待,直到任务执行完毕。但是它返回的是call()方法的返回值。
下面看一下例子:基本和上面的例子是一样的,就是最后调用的方法不一样而已。
public class UserFuture implements Callable<String>{
	private String para;
	public UserFuture(String para) {
		this.para = para;
	}
	@Override
	public String call() throws Exception {
		//模拟执行耗时
		Thread.sleep(1000 * new Random().nextInt(5));
		return para+"处理完成!";
	}
	
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		FutureTask<String> future1 = new FutureTask<String>(new UserFuture("查询1"));
		FutureTask<String> future2 = new FutureTask<String>(new UserFuture("查询2"));
		
		ExecutorService pool = Executors.newFixedThreadPool(2);
		
		Future f1 = pool.submit(future1); 
		Future f2 = pool.submit(future2);
		
		System.out.println("主线程处理其他逻辑任务");
		Thread.sleep(1000);
		
		//调用获取数据的方法,如果call()方法没有执行完成,则依然会进行等待。
		System.out.println(future1.get());  //获取任务1的call方法返回结果
		System.out.println(future2.get());  //获取任务2的call方法返回结果
		
	}
}
执行结果:可以发现等任务执行完毕,返回的确实是call方法的返回值。
主线程处理其他逻辑任务
查询1处理完成!
查询2处理完成!


猜你喜欢

转载自blog.csdn.net/howinfun/article/details/80847065