资讯专栏INFORMATION COLUMN

探秘高并发之java.util.concurrent (二)

Tamic / 1348人阅读

摘要:通过方法提交一个任务,并且通过对象来获得结果。对象可以取消运行任务,设置等待时间,获取任务状态,最终获得任务结果。类似于,但是并不会有返回结果和异常信息。由两个阶段所触发的,没有保证的结果用于依赖阶段的计算。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65028.html

相关文章

  • 探秘并发java.util.concurrent(一)

    摘要:针对高质量多线程并发程序设计时为防死崩等现象的出现,比如使用之前的和等,每每需要考虑性能死锁公平性资源管理以及如何避免线程安全性方面带来的危害等诸多因素,往往会采用一些较为复杂的安全策略,加重了程序员的开发负担。 大家好,最近由于公司的事情不是很多,准备开篇写一写concurrent这一块,因为最近好多面试者对这个都不是很了解,有的是知其然不知其所以然,我写这篇(系列)文章的初衷是为了...

    includecmath 评论0 收藏0
  • java并发系列 - 第1天:必须知道的几个概念

    摘要:并发和并行并发和并行是两个非常容易被混淆的概念。并发说的是在一个时间段内,多件事情在这个时间段内交替执行。并行说的是多件事情在同一个时刻同事发生。由于线程池是一个线程,得不到执行,而被饿死,最终导致了程序死锁的现象。 同步(Synchronous)和异步(Asynchronous) 同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为...

    zhoutk 评论0 收藏0
  • 长文慎入-探索Java并发编程与并发解决方案

    摘要:所有示例代码请见下载于基本概念并发同时拥有两个或者多个线程,如果程序在单核处理器上运行多个线程将交替地换入或者换出内存这些线程是同时存在的,每个线程都处于执行过程中的某个状态,如果运行在多核处理器上此时,程序中的每个线程都 所有示例代码,请见/下载于 https://github.com/Wasabi1234... showImg(https://upload-images.jians...

    SimpleTriangle 评论0 收藏0
  • java并发系列 - 第19天:JUC中的Executor框架详解1,全面掌握java并发相关技术

    摘要:有三种状态运行关闭终止。类类,提供了一系列工厂方法用于创建线程池,返回的线程池都实现了接口。线程池的大小一旦达到最大值就会保持不变,在提交新任务,任务将会进入等待队列中等待。此线程池支持定时以及周期性执行任务的需求。 这是java高并发系列第19篇文章。 本文主要内容 介绍Executor框架相关内容 介绍Executor 介绍ExecutorService 介绍线程池ThreadP...

    icattlecoder 评论0 收藏0
  • 并发

    摘要:表示的是两个,当其中任意一个计算完并发编程之是线程安全并且高效的,在并发编程中经常可见它的使用,在开始分析它的高并发实现机制前,先讲讲废话,看看它是如何被引入的。电商秒杀和抢购,是两个比较典型的互联网高并发场景。 干货:深度剖析分布式搜索引擎设计 分布式,高可用,和机器学习一样,最近几年被提及得最多的名词,听名字多牛逼,来,我们一步一步来击破前两个名词,今天我们首先来说说分布式。 探究...

    supernavy 评论0 收藏0

发表评论

0条评论

Tamic

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<