多线程Callable、Executors、Future

Introduction

Callable接口代表一段可以调用并返回结果的代码;

Future接口表示异步任务,是还没有完成的任务给出的未来结果。

所以Callable用于产生结果,Future用于获取结果。

Callable接口:Java 5在concurrency包中引入了java.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一个对象或者抛出一个异常。Callable接口使用泛型去定义它的返回类型。

Executors类:提供了一些有用的方法在线程池中执行Callable内的任务。由于Callable任务是并行的,我们必须等待它返回的结果。

Future对象:java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它可以知道Callable任务的状态和得到Callable返回的执行结果。Future提供了get()方法让我们可以等待Callable结束并获取它的执行结果。

Callable接口的源码:

public interface Callable<V> {V call() throws Exception; // 计算结果}

Future接口的源码:

public interface Future<V> {boolean cancel(boolean mayInterruptIfRunning);// 试图取消对此任务的执行boolean isCancelled();// 如果在任务正常完成前将其取消,则返回 trueboolean isDone();// 如果任务已完成,则返回 trueV get() throws InterruptedException, ExecutionException; // 如有必要,等待计算完成,然后获取其结果// 如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;}

一个例子

try {Callable<TopicModel> callable = new TopicModelCallable(corpus,param);Future<TopicModel> future = executor.submit(callable);futureList.add(future);} catch (Exception ex) {ex.printStackTrace();}

for (Future<TopicModel> future : futureList) {TopicModel topicModel = future.get();topicModelList.add(topicModel);}Note:

用语料和对应参数创建可调用对象callable, 提交给executor并行执行, 结果保存在future对象中,,最后可以用future对象的get()方法提取执行结果

from:

ref:

如果困难是堵砖墙,拍拍它说你还不够高。

多线程Callable、Executors、Future

相关文章:

你感兴趣的文章:

标签云: