Java多线程:用三个线程控制循环输出10次ABC
转载: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标识由那个线程输出。
- package cn.com.example;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- /**
- * Created by Jack on 2017/2/13.
- */
- public class PrintABC {
- // 有3个线程ABC。按照ABC来运行(A线程输出A,B线程输出B,C线程输出C,以此类推,循环输出)。
- public static int cnt = 0;
- public static final int COUNT = 30;
- public static void main(String[] args) {
- final Lock lock = new ReentrantLock();
- Thread A = new Thread(new Runnable() {
- @Override
- public void run() {
- while (true) {
- lock.lock();
- if (cnt >= COUNT) {
- lock.unlock();
- return;
- }
- if (cnt % 3 == 0) {
- System.out.println("A");
- cnt++;
- }
- lock.unlock();
- }
- }
- });
- Thread B = new Thread(new Runnable() {
- public void run() {
- while (true) {
- lock.lock();
- if (cnt >= COUNT) {
- lock.unlock();
- return;
- }
- if (cnt % 3 == 1) {
- System.out.println("B");
- cnt++;
- }
- lock.unlock();
- }
- }
- });
- Thread C = new Thread(new Runnable() {
- public void run() {
- while (true) {
- lock.lock();
- if (cnt >= COUNT) {
- lock.unlock();
- return;
- }
- if (cnt % 3 == 2) {
- System.out.println("C");
- cnt++;
- }
- lock.unlock();
- }
- }
- });
- A.start();
- B.start();
- C.start();
- }
- }
输出:
- A
- B
- C
- A
- B
- C
- A
- B
- C
- A
- B
- C
- A
- B
- C
- A
- B
- C
- A
- B
- C
- A
- B
- C
- A
- B
- C
- A
- B
- C
Java多线程:用三个线程控制循环输出10次ABC的更多相关文章
- java多线程(六)线程控制类
1. 多线程控制类 为了保证多线程的三个特性,Java引入了很多线程控制机制,下面介绍其中常用的几种: l ThreadLocal l 原子类 l Lock类 l Volatile关键字 ...
- (Java多线程系列三)线程间通讯
Java多线程间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 1.使用wait()和notify()方法在线程中通讯 需求:第一个线程写入(input)用户,另一个线程 ...
- java多线程(三)线程的安全问题
1.1. 什么是线程安全 如果有多个线程同时运行同一个实现了Runnable接口的类,程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的:反之,则是线程不 ...
- Java 多线程(三)—— 线程的生命周期及方法
这篇博客介绍线程的生命周期. 线程是一个动态执行的过程,它也有从创建到死亡的过程. 线程的几种状态 在 Thread 类中,有一个枚举内部类: 上面的信息以图片表示如下: 第一张图: 第二张图:把等待 ...
- Java多线程系列三——实现线程同步的方法
两种实现线程同步的方法 方法 特性 synchronized 不需要显式地加解锁,易实现 ReentrantLock 需要显式地加解锁,灵活性更好,性能更优秀,结合Condition可实现多种条件锁 ...
- Java 多线程(三) 线程的生命周期及优先级
线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: 当用new操作符创建一个新的线程对象时,该线程处 ...
- Java多线程(一) —— 线程的状态详解
一.多线程概述 1. 进程 是一个正在执行的程序.是程序在计算机上的一次运行活动. 每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 系统以进程为基本单位进行系统资源的调度 ...
- Java多线程(三)如何创建线程
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- “全栈2019”Java多线程第三十七章:如何让等待的线程无法被中断
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
随机推荐
- find,xargs,tar有选择打包
find ./ -mtime 83 -exec sz {} \; find . -type f -exec ls -l {} \; \;表达 -exec 的结束. ================== ...
- P2-Centos中安装vsftpd
1. 卸载已有版本 yum remove vsftpd 2. 安装 yum install -y vsftpd 3. 创建文件服务器根目录 mkdir /ftpfile 4. 创建ftp服务器用户 u ...
- 深入浅出的webpack构建工具---babel之配置文件.babelrc(三)
阅读目录 一:理解 babel之配置文件.babelrc 基本配置项 二:在webpack中配置babel 回到顶部 一:理解 babel之配置文件.babelrc 基本配置项 1. 什么是babel ...
- AI 矩阵求导
矩阵求导 参考链接: https://en.wikipedia.org/wiki/Matrix_calculus#Scalar-by-vector_identities
- linux中断源码分析 - 概述(一)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 关于中断和异常 一般在书中都会把中断和异常一起说明,因为它们具有相同的特点,同时也有不同的地方.在CPU里,中断 ...
- 使用yield返回IEnumber<T>集合
yield是对一种复杂行为的简化,就是将一段代码简化为一种简单的形式. 先看一下常规的写法,下面例子中,把找出字符串阵列中,某些元素包含有某些字符的元素. class Bi { public stri ...
- C# DllImport 相对路径无法找到dll
原文:C# DllImport 相对路径无法找到dll 如题,近期在开发过程中,需要调用C++的库,一般来说,使用下面的方法即可正常调用: [DllImport("hci_sys.dll&q ...
- Codeforces Edu Round 63(Rated for Div. 2)
感觉现在Edu场比以前的难多了…… A: 温暖人心 /* basic header */ #include <iostream> #include <cstdio> #incl ...
- KMeans算法分析以及实现
KMeans KMeans是一种无监督学习聚类方法, 目的是发现数据中数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好. 无监督学习,也就是没有对应的标签,只有数据 ...
- python语言程序设计7
1, 特么的打个空格出现就出现个点是个怎么回事, 昨天虽然是我复制的代码,,但也是我一点一点写出来的啊.. 复制的时候缩进直接就没了.我去 但是我感觉它一开始给我讲的一些基础理论又有点忘了,我希望你能 ...