前面分享了CountDownLatch的用法,但是由于分享过程中,发现有些朋友,问我Future与CountDownLatch的有什么区别?
答案:只是concurrent包下的并发帮助工具类,两者并没有什么联系;对于CountDownLatch是关注与子线程的执行完毕情况,而Future是Callable执行call回调包装的返回值;
Runnable是执行工作的独立任务,但是它不返回任何值,如果希望任务完成时能够返回一个值,那么可以实现Callable接口,而不是实现Runnable接口,在Java 1.5中引入Callable是一种具有类型参数的泛型,它的类型参数,是从call()函数中获取到的,而不是run()方法,并且必须使用ExecutorService.submit()方法调用它;
package demo.test; import java.util.ArrayList; import java.util.List; 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; /** * futurn使用demo * * @author bqcoder * @version $Id: FuturnDemo.java, v 0.1 2016年11月22日 下午9:07:13 bqcoder Exp $ */ public class FutureDemo { public static void main(String[] args) { List<Future<String>> taskResults = new ArrayList<Future<String>>(); //创建线程池,使用future必须要使用executors.submit来调用,《乌龟的屁股,规定》 ExecutorService executor = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { Future<String> result = executor.submit(new TaskWithResult(i)); taskResults.add(result); } //获取执行结果 for (int i = 0; i < 10; i++) { try { System.out.println(taskResults.get(i).get()); } catch (InterruptedException e) { } catch (ExecutionException e) { } } } } class TaskWithResult implements Callable<String> { private int taskId; TaskWithResult(int taskId) { this.taskId = taskId; } @Override public String call() throws Exception { return "执行结果:任务taskId=" + taskId; } }
运行结果:
执行结果:任务taskId=0 执行结果:任务taskId=1 执行结果:任务taskId=2 执行结果:任务taskId=3 执行结果:任务taskId=4 执行结果:任务taskId=5 执行结果:任务taskId=6 执行结果:任务taskId=7 执行结果:任务taskId=8 执行结果:任务taskId=9
submit()方法会产生Futurn对象,它用Callable返回结果的特定类型进行了参数化,可以使用Future.isDone()来判断Future查询是否完成,如果完成则返回ture,获取值通过get()方法进行获取,如果查询值还没有完成,则进入阻塞状态。
<未完待续分析~~~>
时间: 2024-12-14 23:40:12