• Java精通并发-通过Condition实现线程间通信实例剖析【中】


    继续上一次https://www.cnblogs.com/webor2006/p/12076950.html的示例继续来往下实现,上一次对需要用到的成员变量进行了定义,回忆下:

    接下来则正式开启具体逻辑的实现,首先来实现生产方法,很显然对于这些操作同时间肯定只能有一个线程进行,所以上锁是肯定的,所以代码如下:

    接下来需要判断一下条件,如果数组元素已经满了,则需要等,其代码写法跟之前咱们用synchronized传统方式实现的差不多,如下:

    注意:这个判断也是需要放到while循环当中,如果条件不满足的话则代表数组有空间可以进行生产,咱们则在指定存放的位置来存放元素既可,如下:

    接下来putIndex需要++,另外还需要加一个条件判断,假如到了数组的最后一个位置了,则需要回到第一个位置,所以代码如下:

    接下来总元素个数则也需要++,然后咱们再将整个数组的内容打印出来便于观测:

    最后别忘了给等待的消费者线程一个非空的条件信号:

    有了这个实现逻辑,那么实现消费的逻辑基本雷同,下面再来过一遍,如下:

    还是先得上锁:

    接下来判断数组是否为空,如果为空则需要等待:

    如果条件不满足,那证明数组中有数据可以消费,那开始消费:

    接下来总takeIndex也得进行++,另外总元素个数也得进行相减:

    最后也别忘了要给等待在生产上的线程一个信号:

    好,生产与消费的逻辑都已经完成,接下来则在main中来调用一下,生成多个生产线程和多个消费者线程来调用看一下程序是否都如预期?生成多个线程这里采用java8的方式来写,而不用传统的那个循环来创建了,毕境学过java8的东东,如今基本上生产环境也都是用的这个版本,得学会用新特性:

     

    下面运行看一下效果:

    好,具体的程序执行分析待下次再进行。。

  • 相关阅读:
    A*算法(八数码问题)
    【第一篇:C++与opencv】图片的读取和显示
    iOS事件拦截(实现触摸任意位置隐藏指定view)
    tableview随笔
    解决UITableView中Cell重用机制导致内容出错的方法总结
    iOS 数据类型转换
    git Xcode
    ios 读取各种类型文件
    iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager(三)
    iOS学习之NSBundle介绍和使用
  • 原文地址:https://www.cnblogs.com/webor2006/p/12083720.html
Copyright © 2020-2023  润新知