本系列关于concurrent的代码示例,是被我分割成了小部分,在系列文章结束以后,我会将较为完整的代码上传,在写的过程中我会参考官方API以及其他牛人的见解,大家有不同的看法可以在下面回复。

这一篇我们继续讲concurrent包下面的接口,本篇讲CallableAsynchronousCompletionTaskCompletionServiceCompletionService;其实这四个接口内容不算多就是概念型的,当然他们并不是用不到的。

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 完成时执行的动作或计算。
其实拆开来看就是,一个阶段的执行可能会触发完成一个单一的阶段,或两个阶段,或多个阶段。在一个阶段的依赖关系被安排使用的方法与前缀。由两个阶段完成所触发的,可以结合他们的结果或效果,使用相应命名的方法。由两个阶段所触发的,没有保证的结果用于依赖阶段的计算。这个类呢可以说让人很难取舍到底什么时候用,什么时候需要做几个阶段的处理计算。这个其实根据大家的业务考虑使用与否,毕竟他只是一个工具,即使有相同业务也可以使用别的方式实现。


小鱼儿
268 声望7 粉丝

请各位Star我最新的开源作品Sapi