使用wait-notify方式实现循环打印

import lombok.extern.slf4j.Slf4j;@Slf4j(topic = "c.TestCycle")
public class TestCycle {public static void main(String[] args) {WaitNotify waitNotify = new WaitNotify(1,5);new Thread(()->{waitNotify.print("a",1,2);}).start();new Thread(()->{waitNotify.print("b",2,3);}).start();new Thread(()->{waitNotify.print("c",3,1);}).start();}}class WaitNotify{private int flag; // 初始的状态值,使用整数作为标记private int loopNum;public WaitNotify(int flag, int loopNum){this.flag = flag;this.loopNum = loopNum;}public void print(String str, int flag, int nextFlag){for (int i = 0; i < loopNum; i++) {synchronized (this){while(this.flag != flag){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.print(str);this.flag = nextFlag;this.notifyAll();}}}
}

使用await-signal方式打印

import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;@Slf4j(topic = "c.TestCycle")
public class TestCycle {static AwaitSignal awaitSignal = new AwaitSignal(5);public static void main(String[] args) {Condition a = awaitSignal.newCondition();Condition b = awaitSignal.newCondition();Condition c = awaitSignal.newCondition();new Thread(()->{awaitSignal.print("a",a,b);}).start();new Thread(()->{awaitSignal.print("b",b,c);}).start();new Thread(()->{awaitSignal.print("c",c,a);}).start();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}awaitSignal.lock();try{a.signal();}finally {awaitSignal.unlock();}}
}class AwaitSignal extends ReentrantLock {private int loopNum;public AwaitSignal(int loopNum){this.loopNum = loopNum;}public void print(String str, Condition current, Condition nextCondition){for (int i = 0; i < loopNum; i++) {lock();try{current.await();System.out.print(str);nextCondition.signal();}catch (InterruptedException e) {e.printStackTrace();}finally {unlock();}}}
}

JUC并发编程九 并发架构--循环打印相关推荐

  1. JUC并发编程九 并发架构--CAS

    compare and set(或者 compare and swap) 原子整数 AtomicBoolean, AtomicInteger, AtomicLong import java.util. ...

  2. 【檀越剑指大厂--并发编程】并发编程总结

    并发编程 一.并发基础 1.什么是并行和并发? 并行,表示两个线程同时(同一时间)做事情. 并发,表示一会做这个事情,一会做另一个事情,存在着调度. 单核 CPU 不可能存在并行(微观上). 2.什么 ...

  3. 【转】Java并发编程:并发容器之ConcurrentHashMap

    JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...

  4. Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

  5. 【Java并发编程】并发编程大合集

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容 ...

  6. java并发编程——九 AbstractQueuedSynchronizer AQS详解

    文章目录 AbstractQueuedSynchronizer概述 AbstractQueuedSynchronizer的使用 AQS实现分析 同步队列 独占锁的获取与释放 独占式超时获取 共享式锁的 ...

  7. 并发编程-01并发初窥

    文章目录 引言 思维导图 基础知识构建 涉及的知识点一览 高并发处理思路与手段一览 并发初窥 概念 并发问题模拟 代码 引言 说来惭愧,一直没有系统的梳理过并发编程的知识,这次借着学习_Jimin_老 ...

  8. 学习笔记:Java 并发编程⑥_并发工具_JUC

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  9. Java并发编程进阶——并发锁

    1 JAVA 多线程锁介绍 1.1 悲观锁 定义:悲观锁指对数据被外界修改持保守态度,认为数据很容易就会被其他线程修改(很悲观),所以在数据被处理前先对数据进行加锁,并在整个数据处理过程中,使数据处于 ...

最新文章

  1. tomcat8 启动项目pom.xml配置
  2. android蓝牙音乐之AVRCP介绍和使用
  3. redis特点单进程单线程高性能服务器,Redis为什么是单线程?Redis又为什么这么快!...
  4. 数据挖掘 点击更多 界面_8(更多)技巧,可快速改善用户界面
  5. axure日期选择器组件_vue干货分享,超过六种组件通信方法讲解和精髓归纳
  6. c/c++ 时间函数总结 linux
  7. CentOS英文环境下使用ibus输入法
  8. pve网卡直通虚拟机pve失联打不开解决方案,不用重新安装pve
  9. java系统排序_java各种排序实现
  10. 推荐好用在线画图网站
  11. 基于R语言利用QQ群进行数据挖掘案例整理
  12. pdf加密阅读html,pdf文档加密如何解除
  13. 谷歌浏览器插件 - 为 Microsoft Bing 搜索引擎首页添加一个【保存背景图片】的按钮(版本 1)
  14. SPSS数据分析-交叉表分析
  15. linux twm_回到TWM Linux桌面基础知识
  16. 视频号如何给账号定位,如何做好视频号的定位
  17. scrapy下载斗鱼主播图片
  18. 写了一个简单的画板 箭头比较难搞 虚线 虚直线 实线 实直线 椭圆 圆 正方形
  19. 云计算安全测评:云原生安全
  20. 移动端自适应解决方法小结

热门文章

  1. 前方高能 | 容器化应用操作原来可以这样简单
  2. 关于Combobox的多选和单选情况
  3. 【转】解决从jenkins打开robot framework报告会提示‘Opening Robot Framework log failed ’的问题...
  4. 分页浏览的导航栏Bootstrap和js两种方法
  5. JQuery Deferred 对象
  6. B-Trees Concepts B-树介绍(都快忘了:))
  7. 记一次工作中的小BUG
  8. scrapy-splash抓取动态数据例子八
  9. readonly时禁用删除键,readonly按删除键后页面后退解决方案
  10. C# Settings使用小结