一、问题

4个线程去依次顺序打印出ABCD,为了保证打印出A后,需要打印B,那么我们肯定是A线程执行后,是定点唤醒B线程,所以自然就会用到CONDITION的await和signal

二、代码

public class CirPrinterTest implements Runnable {//成员变量//打印次数;打印条件;触发下一个指定线程打印;打印的字符;定点唤醒的锁int printCount;Condition thisCondition;Condition nextCondition;char printChar;Lock lock;//构造方法public CirPrinterTest(int printCount, Lock lock, Condition thisCondition, Condition nextCondition, char printChar){this.printCount = printCount;this.lock = lock;this.thisCondition = thisCondition;this.nextCondition = nextCondition;this.printChar = printChar;}//重写run类@Overridepublic void run() {//进来了就要锁住防止其他线程来跑lock.lock();//有了锁,必须要解锁因此,try,catch,finallytry{//开始进行打印for(int i = 0; i < printCount; i++){System.out.println(printChar);//唤醒下一个线程进行打印nextCondition.signal();//打印了好了最后一次就不需要上锁了,否则会死锁if(i < printCount - 1){thisCondition.await();}}} catch (Exception e) {e.printStackTrace();}finally {lock.unlock();}}public static void main(String[] args) throws InterruptedException {Lock lock =   new ReentrantLock();Condition conditionA = lock.newCondition();Condition conditionB = lock.newCondition();Condition conditionC = lock.newCondition();Condition conditionD = lock.newCondition();//需要打印的次数int printCount = 10;//初始化线程Thread printA = new Thread(new CirPrinterTest(printCount, lock, conditionA, conditionB, 'A'));Thread printB = new Thread(new CirPrinterTest(printCount, lock, conditionB, conditionC, 'B'));Thread printC = new Thread(new CirPrinterTest(printCount, lock, conditionC, conditionD, 'C'));Thread printD = new Thread(new CirPrinterTest(printCount, lock, conditionD, conditionA, 'D'));//线程池处理,个数要大于等于4,因为不是的话,其中唤醒不了D就会死锁。ExecutorService threadPool = Executors.newFixedThreadPool(3);threadPool.execute(printA);threadPool.execute(printB);threadPool.execute(printC);threadPool.execute(printD);//每个线程分别启动
//        printA.start();
//        Thread.sleep(100);
//        printB.start();
//        Thread.sleep(100);
//        printC.start();
//        Thread.sleep(100);
//        printD.start();}
}

我的主页有一些博主总结的面经~  如果有任何不懂的都可以问我。讲懂为止!!! 随带我自己也复习,哈哈哈~~~

多线程打印ABCD顺序(带有线程池实现)相关推荐

  1. Java多线程学习(八)线程池与Executor 框架

    历史优质文章推荐: Java并发编程指南专栏 分布式系统的经典基础理论 可能是最漂亮的Spring事务管理详解 面试中关于Java虚拟机(jvm)的问题看这篇就够了 目录: [TOC] 本节思维导图: ...

  2. android 多线程下载,断点续传,线程池

    android 多线程下载,断点续传,线程池 你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效 ...

  3. Java多线程(十一)之线程池深入分析(上)

    线程池是并发包里面很重要的一部分,在实际情况中也是使用很多的一个重要组件. 下图描述的是线程池API的一部分.广义上的完整线程池可能还包括Thread/Runnable.Timer/TimerTask ...

  4. Java多线程学习六:使用线程池比手动创建线程好在那里以及常用线程池参数的意义

    为什么要使用线程池 首先,回顾线程池的相关知识,在 Java 诞生之初是没有线程池的概念的,而是先有线程,随着线程数的不断增加,人们发现需要一个专门的类来管理它们,于是才诞生了线程池.没有线程池的时候 ...

  5. 多线程必须用到的线程池(什么时候用多线程)

    案例需求:要开发的项目是一个IT问答平台,其中用户发布问题后,需要给平台上所有选了该问题类别的邮箱中各发一份邮件. 分析:这个时候就必须用到多线程了,因为用户发布问题和给其他用户发邮件可以说是两个相互 ...

  6. Java多线程系列(三):Java线程池的使用方式,及核心运行原理

    之前谈过多线程相关的4种常用Java线程锁的特点,性能比较.使用场景,今天主要分享线程池相关的内容,这些都是属于Java面试的必考点. 为什么需要线程池 java中为了提高并发度,可以使用多线程共同执 ...

  7. java 任务池_多线程的应用-异步任务线程池的简单实现

    对于服务端的应用而言,经常会出现比如定时任务,或者任务的异步执行,熟悉Java开发的开发者,经常会使用Executors类,其提供了4种不同的线程池: ​newCachedThreadPool, ne ...

  8. 2.2 多线程:concurrent.futures实现线程池

    1.多进程与多线程 多进程 优点:独立内存空间:实现代码直观简单:充分利用多核多CPU:避免全局解释器锁的限制: 缺点:无法实现对象和内容共享:需要较大的内存空间. 应用:一般用于数学计算.数据处理等 ...

  9. Java 多线程:彻底搞懂线程池

    熟悉 Java 多线程编程的同学都知道,当我们线程创建过多时,容易引发内存溢出,因此我们就有必要使用线程池的技术了. 目录 1 线程池的优势 2 线程池的使用 3 线程池的工作原理 4 线程池的参数 ...

  10. 爬虫-python -(8) 多线程与多进程操作以及线程池 异步操作

    文章目录 1.通过异步操作提高爬虫效率 2.多线程 3.多进程 4.线程池与进程池 5.线程池实例-新发地菜价保存 6.总结 1.通过异步操作提高爬虫效率 一般爬虫过程为,请求网页-响应请求-从响应中 ...

最新文章

  1. iOS 疑难杂症— — 收到推送显示后自动消失的问题
  2. flex中toolTip汇总
  3. 高等数学与python高级应用_python高级应用程序与设计
  4. instagram技术_Instagram9位科技女孩进行技术采访的主要技巧
  5. Java中的锁(转)
  6. 望城2019年华为软件云项目_今天,华为、京东两大项目在长沙开工
  7. html元素可以有多个ID吗?
  8. pytorch---nn模块(3)自定义nn 模块
  9. 7.大数据架构详解:从数据获取到深度学习 --- 批处理技术
  10. 安装多个win10系统
  11. MFC之画圆弧 任意三点绘制圆弧求弧长
  12. npm ERR! File exists: /XXX/xxx npm ERR! Move it away, and try again.
  13. Python3 安装cx_Oracle 指导手册
  14. pythoneval函数错误_python中eval函数未实现错误
  15. 美国服务器怎么怎么修改密码,RAKsmart美国服务器更改密码的简单方法
  16. U盘制作ubuntu18.04.6系统安装盘
  17. 总结2016年国内外的AR/VR产品
  18. 基础课程11:调试工具
  19. 探秘前端 CRDT 实时协作库 Yjs 工程实现
  20. jqGrid 学习笔记整理——基础篇

热门文章

  1. 无线AP与无线路由器都有些什么区别?(二)
  2. mybatis-generator逆向工程设置不生成Example类
  3. WordPress出现循环重定向解决办法
  4. postgresql将数据从一个表内容插入到另一个表_关系型数据库管理系统openGauss 1.0.1版本发布...
  5. svn服务器搭建和使用_使用Gitea搭建自己的Git服务器
  6. Java数据结构:稀疏数组(Sparse Array)的创建和文件存取
  7. 毫秒和秒的换算工具_使用后戒不掉的文档搜索工具:Everything
  8. 怎样将树的中序遍历的数输入到一个数组中_二叉搜索树的后序遍历序列(剑指offer第三十一天)...
  9. 【学习笔记】堆的定义及其建立、排序等基本操作的实现
  10. java框架是什么_Spring 是什么框架?