本系列关于concurrent的代码示例,是被我分割成了小部分,在系列文章结束以后,我会将较为完整的代码上传,在写的过程中我会参考官方API以及其他牛人的见解,大家有不同的看法可以在下面回复。
这一篇我们继续讲concurrent包下面的接口,本篇讲Callable
、 AsynchronousCompletionTask
、CompletionService
、CompletionService
;其实这四个接口内容不算多就是概念型的,当然他们并不是用不到的。
1. Callable
实现Callable接口的类其实就是一个可以返回结果的任务,并且可以抛出异常。 通过ExecutorService.submit
方法提交一个callable任务,并且通过Future对象来获得结果。 Future对象可以取消运行任务,设置等待时间,获取任务状态,最终获得任务结果。Callable类似于 Runnable,但是runnable并不会有返回结果和异常信息。这一点我们需要区别开。
2. AsynchronousCompletionTask
一个标记接口识别异步任务的异步方法。他可以提供监控,调试和跟踪异步活动。
3. CompletionService
ExecutorService的扩展,可以获得线程执行结果。
代码示例:
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestCompletionService {
public static void main(String[] args) throws InterruptedException,
ExecutionException {
ExecutorService exec = Executors.newFixedThreadPool(10);
CompletionService serv = new ExecutorCompletionService(exec);
for (int index = 0; index < 5; index++) {
final int NO = index;
Callable downImg = new Callable() {
public String call() throws Exception {
Thread.sleep((long) (Math.random() * 10000));
return "Downloaded Image " + NO;
}
};
serv.submit(downImg);
}
Thread.sleep(1000 * 2);
System.out.println("Show web content");
for (int index = 0; index < 5; index++) {
Future task = serv.take();
String img = (String)task.get();
System.out.println(img);
}
System.out.println("End");
// 关闭线程池
exec.shutdown();
}
}
4. CompletionStage
异步计算中可能出现的一个阶段,也就是说当一个CompletionStage 完成时执行的动作或计算。
其实拆开来看就是,一个阶段的执行可能会触发完成一个单一的阶段,或两个阶段,或多个阶段。在一个阶段的依赖关系被安排使用的方法与前缀。由两个阶段完成所触发的,可以结合他们的结果或效果,使用相应命名的方法。由两个阶段所触发的,没有保证的结果用于依赖阶段的计算。这个类呢可以说让人很难取舍到底什么时候用,什么时候需要做几个阶段的处理计算。这个其实根据大家的业务考虑使用与否,毕竟他只是一个工具,即使有相同业务也可以使用别的方式实现。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。