转载:http://www.cnblogs.com/gaopeng527/p/5257884.html

题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程, 按顺序输出ABC, 循环10次。

解题思路:要按顺序输出ABC, 循环10次,就要控制三个线程同步工作,也就是说要让三个线程轮流输出,直到10个ABC全部输出则结束线程。这里用一个Lock对象来控制三个线程的同步。用一个int型变量COUNT标识由那个线程输出。

  1. package cn.com.example;
  2.  
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;
  5.  
  6. /**
  7. * Created by Jack on 2017/2/13.
  8. */
  9. public class PrintABC {
  10.  
  11. // 有3个线程ABC。按照ABC来运行(A线程输出A,B线程输出B,C线程输出C,以此类推,循环输出)。
  12.  
  13. public static int cnt = 0;
  14. public static final int COUNT = 30;
  15.  
  16. public static void main(String[] args) {
  17.  
  18. final Lock lock = new ReentrantLock();
  19. Thread A = new Thread(new Runnable() {
  20.  
  21. @Override
  22. public void run() {
  23. while (true) {
  24. lock.lock();
  25. if (cnt >= COUNT) {
  26. lock.unlock();
  27. return;
  28. }
  29. if (cnt % 3 == 0) {
  30. System.out.println("A");
  31. cnt++;
  32. }
  33. lock.unlock();
  34. }
  35. }
  36.  
  37. });
  38.  
  39. Thread B = new Thread(new Runnable() {
  40. public void run() {
  41. while (true) {
  42. lock.lock();
  43. if (cnt >= COUNT) {
  44. lock.unlock();
  45. return;
  46. }
  47. if (cnt % 3 == 1) {
  48. System.out.println("B");
  49. cnt++;
  50. }
  51. lock.unlock();
  52. }
  53. }
  54. });
  55.  
  56. Thread C = new Thread(new Runnable() {
  57. public void run() {
  58. while (true) {
  59. lock.lock();
  60. if (cnt >= COUNT) {
  61. lock.unlock();
  62. return;
  63. }
  64. if (cnt % 3 == 2) {
  65. System.out.println("C");
  66. cnt++;
  67. }
  68. lock.unlock();
  69. }
  70. }
  71. });
  72. A.start();
  73. B.start();
  74. C.start();
  75. }
  76.  
  77. }

输出:

  1. A
  2. B
  3. C
  4. A
  5. B
  6. C
  7. A
  8. B
  9. C
  10. A
  11. B
  12. C
  13. A
  14. B
  15. C
  16. A
  17. B
  18. C
  19. A
  20. B
  21. C
  22. A
  23. B
  24. C
  25. A
  26. B
  27. C
  28. A
  29. B
  30. C

Java多线程:用三个线程控制循环输出10次ABC的更多相关文章

  1. java多线程(六)线程控制类

    1.   多线程控制类 为了保证多线程的三个特性,Java引入了很多线程控制机制,下面介绍其中常用的几种: l  ThreadLocal l  原子类 l  Lock类 l  Volatile关键字 ...

  2. (Java多线程系列三)线程间通讯

    Java多线程间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 1.使用wait()和notify()方法在线程中通讯 需求:第一个线程写入(input)用户,另一个线程 ...

  3. java多线程(三)线程的安全问题

    1.1. 什么是线程安全 如果有多个线程同时运行同一个实现了Runnable接口的类,程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的:反之,则是线程不 ...

  4. Java 多线程(三)—— 线程的生命周期及方法

    这篇博客介绍线程的生命周期. 线程是一个动态执行的过程,它也有从创建到死亡的过程. 线程的几种状态 在 Thread 类中,有一个枚举内部类: 上面的信息以图片表示如下: 第一张图: 第二张图:把等待 ...

  5. Java多线程系列三——实现线程同步的方法

    两种实现线程同步的方法 方法 特性 synchronized 不需要显式地加解锁,易实现 ReentrantLock 需要显式地加解锁,灵活性更好,性能更优秀,结合Condition可实现多种条件锁 ...

  6. Java 多线程(三) 线程的生命周期及优先级

    线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: 当用new操作符创建一个新的线程对象时,该线程处 ...

  7. Java多线程(一) —— 线程的状态详解

    一.多线程概述  1. 进程 是一个正在执行的程序.是程序在计算机上的一次运行活动. 每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 系统以进程为基本单位进行系统资源的调度 ...

  8. Java多线程(三)如何创建线程

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  9. “全栈2019”Java多线程第三十七章:如何让等待的线程无法被中断

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. find,xargs,tar有选择打包

    find ./ -mtime 83 -exec sz {} \; find . -type f -exec ls -l {} \; \;表达 -exec 的结束. ================== ...

  2. P2-Centos中安装vsftpd

    1. 卸载已有版本 yum remove vsftpd 2. 安装 yum install -y vsftpd 3. 创建文件服务器根目录 mkdir /ftpfile 4. 创建ftp服务器用户 u ...

  3. 深入浅出的webpack构建工具---babel之配置文件.babelrc(三)

    阅读目录 一:理解 babel之配置文件.babelrc 基本配置项 二:在webpack中配置babel 回到顶部 一:理解 babel之配置文件.babelrc 基本配置项 1. 什么是babel ...

  4. AI 矩阵求导

    矩阵求导 参考链接: https://en.wikipedia.org/wiki/Matrix_calculus#Scalar-by-vector_identities

  5. linux中断源码分析 - 概述(一)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 关于中断和异常 一般在书中都会把中断和异常一起说明,因为它们具有相同的特点,同时也有不同的地方.在CPU里,中断 ...

  6. 使用yield返回IEnumber<T>集合

    yield是对一种复杂行为的简化,就是将一段代码简化为一种简单的形式. 先看一下常规的写法,下面例子中,把找出字符串阵列中,某些元素包含有某些字符的元素. class Bi { public stri ...

  7. C# DllImport 相对路径无法找到dll

    原文:C# DllImport 相对路径无法找到dll 如题,近期在开发过程中,需要调用C++的库,一般来说,使用下面的方法即可正常调用: [DllImport("hci_sys.dll&q ...

  8. Codeforces Edu Round 63(Rated for Div. 2)

    感觉现在Edu场比以前的难多了…… A: 温暖人心 /* basic header */ #include <iostream> #include <cstdio> #incl ...

  9. KMeans算法分析以及实现

    KMeans KMeans是一种无监督学习聚类方法, 目的是发现数据中数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好. 无监督学习,也就是没有对应的标签,只有数据 ...

  10. python语言程序设计7

    1, 特么的打个空格出现就出现个点是个怎么回事, 昨天虽然是我复制的代码,,但也是我一点一点写出来的啊.. 复制的时候缩进直接就没了.我去 但是我感觉它一开始给我讲的一些基础理论又有点忘了,我希望你能 ...