public class CompletionServiceTest { public static void main(String[] args) { CompletionServiceTest test = new CompletionServiceTest(); try { test.getValueByFuture(); test.getValueByCompletionService(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } public void getValueByFuture() throws InterruptedException, ExecutionException { ExecutorService threadPool = Executors.newSingleThreadExecutor(); Future<String> future = threadPool.submit(new ExeCall()); System.out.println(future.get());//返回值是一个随机数 threadPool.shutdown(); } public void getValueByCompletionService() throws InterruptedException, ExecutionException { int threadPoolSize = 10; ExecutorService threadPool = Executors.newFixedThreadPool(threadPoolSize); CompletionService<String> completionService = new ExecutorCompletionService<String>(threadPool); for (int i = 1; i <= threadPoolSize; i++) { Future<String> future = completionService.submit(new ExeCall()); System.out.println(future.get());//返回值是一个随机数 } //也可以等所有线程执行完再获取线程的返回值 for (int i = 1; i <= threadPoolSize; i++) { System.out.println(completionService.take().get()); } threadPool.shutdown(); } class ExeCall implements Callable<String> { @Override public String call() throws Exception { Random ra = new Random(); int num = ra.nextInt(100); return "Get a random number : " + num; } } }
1.Future模式可以这样来描述:
我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。
2.Future接口
Future 表示异步计算的结果。
Future接口提供方法来检测任务是否被执行完,等待任务执行完获得结果。也可以设置任务执行的超时时间。
如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。
public void getValueByFuture() throws InterruptedException, ExecutionException {
FutureTask<String> future = new FutureTask<String>(new ExeCall());
ExecutorService threadPool = Executors.newSingleThreadExecutor();
threadPool.execute(future);
try {
String result = future.get(3000,TimeUnit.MILLISECONDS);//取得结果,同时设置超时执行时间为3秒
System.out.println(result);
} catch (TimeoutException e) {
future.cancel(true);
} finally {
threadPool.shutdown();
}
}
3.Future的实现类
Future的实现类有java.util.concurrent.FutureTask<V>,FutureTask类同时又实现了Runnable接口,所以可以直接提交给Thread、Executor执行。
public void getValueByFuture() throws InterruptedException, ExecutionException {
FutureTask<String> future = new FutureTask<String>(new ExeCall());
new Thread(future).start();
System.out.println(future.get());
}
或
public void getValueByFuture() throws InterruptedException, ExecutionException {
FutureTask<String> future = new FutureTask<String>(new ExeCall());
ExecutorService threadPool = Executors.newSingleThreadExecutor();
threadPool.execute(future);
System.out.println(future.get());
threadPool.shutdown();
}