建立三个线程,线程名字分别为:A、B、C,要求三个线程分别打印自己的线程名字,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。打印10轮,打印完毕控制台输出字符串:"打印完毕"

方法之一:使用Condition等待唤醒机制,代码如下:

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/**

* Created by gan on 2019/5/19 10:54.

*/

public class ConditionDemo {

private static int num = 1; //打印“谁”标识符

private static Lock lock = new ReentrantLock();

private static final Condition conditionA = lock.newCondition();

private static final Condition conditionB = lock.newCondition();

private static final Condition conditionC = lock.newCondition();

private static CountDownLatch countDownLatch = new CountDownLatch(10); //使用闭锁计数器

public static void main(String[] args) throws Exception {

long loop = countDownLatch.getCount(); //初始化打印轮数

new Thread(() -> {

for (int i = 1; i <= loop; i++) {

try {

printA();

} catch (InterruptedException e) {

}

}

}, "A").start();

new Thread(() -> {

for (int i = 1; i <= loop; i++) {

try {

printB();

} catch (InterruptedException e) {

}

}

}, "B").start();

new Thread(() -> {

for (int i = 1; i <= loop; i++) {

try {

printC(i);

} catch (InterruptedException e) {

}

}

}, "C").start();

countDownLatch.await();

System.out.println("打印完毕.........");

}

//打印‘A’的方法

public static void printA() throws InterruptedException {

lock.lock();

if (num != 1) { //标识符等于1的时候打印A

conditionA.await();

}

System.out.print(Thread.currentThread().getName());

num = 2;

conditionB.signal();

lock.unlock();

}

//打印‘B’的方法

public static void printB() throws InterruptedException {

lock.lock();

if (num != 2) { //标识符等于2的时候打印B

conditionB.await();

}

System.out.print(Thread.currentThread().getName());

num = 3;

conditionC.signal();

lock.unlock();

}

//打印‘C’的方法

public static void printC(int loop) throws InterruptedException {

lock.lock();

if (num != 3) { //标识符等于3的时候打印A

conditionC.await();

}

System.out.print(Thread.currentThread().getName());

System.out.print("[" + loop + "]"); //轮数间隔符号

num = 1;

conditionA.signal();

countDownLatch.countDown();

lock.unlock();

}

}

运行结果如下:

用三个线程按顺序循环打印ABC三个字母

有两种方法:semaphore信号量和mutex互斥锁.需要注意的是C++11已经没有semaphore. C++ 并发编程(六):信号量(Semaphore) - 止于至善 - SegmentFau ...

多个线程分别顺序交替打印一种不同字符abcdefg&lpar;已实现随便多少个线程打印多少个字符&comma;利用线程池实现多线程&rpar;

下面实现多线程顺序打印字符"abcdefg": 实现Runnable接口: /** * @author: rhyme * @date: 2019-08-17 14:39 * @to ...

三个线程ABC,交替打印ABC

转载与:https://www.cnblogs.com/x_wukong/p/4009709.html 创建3个线程,让其交替打印ABC . 输出如下:  ABCABCABCABC. 方法:使用syn ...

斐讯面试记录—三线程交替打印ABC

package cn.shenzhen.feixun; public class PrintABC extends Thread{ private String name; private Objec ...

【Java多线程系列四】控制线程执行顺序

假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatc ...

python多线程交替打印abc以及线程池进程池的相关概念

import threading import sys import time def showa(): while True: lockc.acquire() #获取对方的锁,释放自己的锁 prin ...

一道有意思的多线程面试题 C&num; 代码实现

如果你对多线程的控制不怎么了解,那么理解了这篇文章的内容也许对你有帮助.鼓励先自己动手实现一遍,做不出来在看代码. 题目一:两个线程交替打印0~100的奇偶数 这道题就是说有两个线程,一个名为偶数线程 ...

随机推荐

c&plus;&plus; static及const(开发者在线)

static 是c++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因.作用谈起,全面分析static 修饰符的实质. static 的两大作用: 一. ...

Nginx简单配置

Nginx 配置文件结构如果你下载好啦,你的安装文件,不妨打开 conf 文件夹的 nginx.conf 文件,Nginx 服务器的基础配置,默认的配置也存放在此.在 nginx.conf 的注释符号 ...

poj 题目分类&lpar;1&rpar;

poj 题目分类 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K--0.50K:中短代码:0.51K--1.00K:中等代码量:1.01K--2.00K:长代码:2.01 ...

每日一&OpenCurlyDoubleQuote;酷”之string

介绍:string模块可以追溯到最早的Python版本中.现在很多的被移植为str和unicode对象的方法,在python3.0中会被完全去除.string模块中,有很多有用的常量和累,用来处理st ...

Android EditText圆角的方法

一.在drawable下面添加xml文件rounded_editview.xml <?xml version="1.0" encoding="utf-8" ...

PLSQL学习教程&lpar;全&rpar;

基于ORACLE9i+PL/SQLDeveloper7.1.4) 课程 一 PL/SQL 基本查询与排序 本课重点: 1.写SELECT语句进行数据库查询 2.进行数学运算 3.处理空值 4.使用别名 ...

HTML5 移动端的上下左右滑动问题

在移动端页面上,如果要实现[顶部轮播,手指触摸左右滑动]我的方案是,通过监听滑动,阻止默认事件来完成 div.addEventListener('touchmove',function(event){ ...

【vim】查找重复的连续的单词

当你很快地打字时,很有可能会连续输入同一个单词两次,就像 this this.这种错误可能骗过任何一个人,即使是你自己重新阅读一遍也不可避免.幸运的是,有一个简单的正则表达式可以用来预防这个错误.使用 ...

&lbrack;C&plus;&plus;&rsqb;QString方法集

QString s =  "hello world"; s. indexOf ( "o" )); //4 s. lastIndexOf ( "o&qu ...

Leetcode 5016&period; 删除最外层的括号

5016. 删除最外层的括号  显示英文描述 我的提交返回竞赛   用户通过次数446 用户尝试次数469 通过次数456 提交次数577 题目难度Easy 有效括号字符串为空 ("&quo ...

c语言父子线程交替打印,多线程面试题之【三线程按顺序交替打印ABC的方法】...相关推荐

  1. thread.sleep是让哪个线程休眠_java多线程必看:java线程的生命周期

    点击蓝字 关注我们 线程是一个动态执行的过程,它也有从创建到死亡的过程.线程的几种状态 在 Thread 类中,有一个枚举内部类: 上面的信息以图片表示如下: 第一张图: 第二张图:把等待.计时等待. ...

  2. java 多线程使用线程池_Java多线程:如何开始使用线程

    java 多线程使用线程池 什么是线程? (What is a Thread?) A thread is a lightweight process. Any process can have mul ...

  3. linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...

    你写了一个简单的mandelbrot set程序,也就是说用ps命令行是可以看见多个线程,win32里同一个进程里各个线程之间是共享数据段的,win32的进程管理方式与unix上有着很大区别.adob ...

  4. call线程起名字_多线程面试题总结

    1.什么是线程,什么是进程,它们有什么区别和联系,一个进程里面是否必须有个线程 进程本质是一个正在执行的程序,一个进程可以有多个线程.线程是进程的最小执行单位,一个进程至少有一个线程 区别:1:多进程 ...

  5. parallelstream启动的线程数_高并发与多线程网络学习笔记(三)线程组和线程池

    线程组 线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织. 构造函数 ThreadGroup(String name)//默认parent为当前线程组 ThreadGro ...

  6. go和java线程,Go的多线程和pthread或Java线程有什么区别?

    正如之前的答案所述,go例程并不一定与系统线程相对应,但是如果你现在必须提高多线程的性能,我发现以下内容很有用: The current implementation of the Go runtim ...

  7. Java多线程面试题:子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50次

    近在学习多线程,特贴在这里,并附上自己所作答案(参考与张孝祥老师的方法). 题目如下: 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50 ...

  8. java线程 stop()_java 多线程5: java 终止线程及中断机制 (stop()、interrupt() 、interrupted()、isInterrupted())...

    JAVA中有3种方式可以终止正在运行的线程 ①线程正常退出,即run()方法执行完毕了 ②使用Thread类中的stop()方法强行终止线程.但stop()方法已经过期了,不推荐使用 ③使用中断机制i ...

  9. linux生产者进程数为3个,linux 多线程面试题_linux 进程线程_linux 线程 进程(3)

    //生产者线程函数 unsignedint__stdcallProducerThreadFun(PVOIDpM) { for(inti=1;i<=END_PRODUCE_NUMBER;i++) ...

  10. c语言多线程面试题,iOS面试题--网络多线程

    一.多线程的底层实现? 1>线程:Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程 2>开发中很少用Mach级的线程,因为Mach级的线程没有提供多 ...

最新文章

  1. 在医疗领域你知道哪些人工智能黑科技?
  2. 免安装版 mysql-5.6.29-winx64 下载,配置
  3. Java 二维数组的初始化
  4. vb+socket 编写入侵监听程序
  5. CVPR 2019 | 基于可解释性以及细粒度的可视化解释卷积神经网络
  6. Spring字段注入
  7. 算法分析-动态规划-01背包
  8. 素数筛(快速筛)-爱拉托斯特尼筛法+欧拉筛
  9. MVpArms集成框架快速开发
  10. 当 TiDB 遇到图数据库 | TiDB Hackathon 2020 优秀项目分享
  11. Windows 10 驱动开发 及 驱动签名
  12. java中display中的属性_全面解析display属性
  13. policy服务器未能登录,win7电脑提示group policy client服务未能登录的解决方法
  14. Java打印101-150之间所有的质数
  15. form提交的几种方法
  16. GeoHash算法与用法
  17. bzoj4668: 冷战
  18. 英文软件测试文章翻译,软件测试中英文对照外文翻译文献
  19. The Cook and the Chef: Musk’s Secret Sauce
  20. 云端的精彩:让信息在指尖流动

热门文章

  1. 小鸡腿U T6 2013FINAL
  2. file_get_contents
  3. rs.next()的理解
  4. 鲲鹏920是计算机CPU吗,鲲鹏920是电脑cpu吗
  5. 安装windows时install.wim文件过大的解决方案
  6. 格拉姆-施密特正交化
  7. 深度强化学习算法研究中的常用对比试验及作图技巧
  8. Android Runtime (ART) 和 Dalvik
  9. 医疗后台管理系统项目
  10. 前端安装项目报错1.gyp info it worked if it ends with ok