第一种

public static volatile int flag = 1;

public static void printABC1(){

    Thread t1 = new Thread(() -> {
while (true) {
synchronized (obj1) {
while (flag != 1){
try {
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println("T1:A");
Thread.sleep(1000);
flag = 2;
obj1.notifyAll();
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
}); Thread t2 = new Thread(() -> {
while (true) {
synchronized (obj1) {
while (flag != 2){
try {
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println("T2:B");
Thread.sleep(1000);
flag = 3;
obj1.notifyAll();
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
}); Thread t3 = new Thread(() -> {
while (true) {
synchronized (obj1) {
while (flag != 3){
try {
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println("T3:C");
Thread.sleep(1000);
flag = 1;
obj1.notifyAll();
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
}); t1.start();
t2.start();
t3.start(); }

第二种

public static ReentrantLock lock = new ReentrantLock();
public static Condition condition1 = lock.newCondition();
public static volatile int flag2 = 0; public static void printABC2(){ Thread t1 = new Thread(() -> {
while (true){
lock.lock();
while (flag2 % 3 != 0){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println("T1:A");
Thread.sleep(1000);
flag2++;
condition1.signalAll();
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}); Thread t2 = new Thread(() -> {
while (true) {
lock.lock();
while (flag2 % 3 != 1){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println("T2:B");
Thread.sleep(1000);
flag2++;
condition1.signalAll();
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}); Thread t3 = new Thread(() -> {
while (true) {
lock.lock();
while (flag2 % 3 != 2){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println("T3:C");
Thread.sleep(1000);
flag2++;
condition1.signalAll();
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}); t1.start();
t2.start();
t3.start(); }

三个线程按循序一个打印A一个打印B一个打印C 循环打印?的更多相关文章

  1. 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...

  2. 迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC

    题目:http://wenku.baidu.com/view/d66187aad1f34693daef3e8a.html 启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC. ...

  3. 面试官:线程池如何按照core、max、queue的执行循序去执行?(内附详细解析)

    前言 这是一个真实的面试题. 前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core.max.queue的执行循序去执行?". 我们都知道线程池中代码执行顺 ...

  4. C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。

    添加三个线程同时启动执行某一方法,并依次调用某方法中的打印输:ABC ABC ABC ABC 实现代码如下: using System; using System.Collections.Generi ...

  5. 使用Java实现三个线程交替打印0-74

    使用Java实现三个线程交替打印0-74 题目分析 三个线程交替打印,即3个线程是按顺序执行的.一个线程执行完之后,唤醒下一个线程,然后阻塞,等待被该线程的上一个线程唤醒.执行的顺序是一个环装的队列 ...

  6. java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现

    注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...

  7. 有三个线程,a、b、c,a打印“T1”,b打印“T2”,c打印“T3”,a执行完后,b执行;b执行完后,c执行。如此循环100遍

    有三个线程,a.b.c,a打印“T1”,b打印“T2”,c打印“T3”,a执行完后,b执行:b执行完后,c执行.如此循环100遍. package com.company; /** * 测试三个线程协 ...

  8. 开启两个线程,一个线程打印A~Z,一个线程打印1~52的数据

    开启两个线程,一个线程打印A-Z,一个线程打印1-52的数据 import java.util.concurrent.locks.Condition; import java.util.concurr ...

  9. java Semaphore实现ABC三个线程循环打印

    Semaphore位于java.util.concurrent包下.其中有两个重要的方法acquire()和release().acquire用来获取一个信号量,并且是阻塞型的,如果当前还有可用的信号 ...

随机推荐

  1. EF Core3.1 CodeFirst动态自动添加表和字段的描述信息

    前言 我又来啦.. 本篇主要记录如何针对CodeFirst做自动添加描述的扩展 为什么要用这个呢.. 因为EF Core3.1 CodeFirst 对于自动添加描述这块 只有少部分的数据库支持.. 然 ...

  2. centos7 U盘安装及Raid划分的完整流程

    目录 一.Centos7的新特性: 二.安装方法与准备工作(U盘镜像) 1. 安装方法介绍 2. Centos iso 常用镜像下载地址: 3. UltraISO制作U盘系统镜像 3.1 准备工作: ...

  3. Java集合Stream类filter的使用

    之前的Java集合中removeIf的使用一文写了使用removeIf来实现按条件对集合进行过滤.这篇文章使用同样是JDK1.8新加入的Stream中filter方法来实现同样的效果.并且在实际项目中 ...

  4. mpvue开发小程序项目遇到的问题

    mpvue项目 最近用mpvue开发了一个家庭私人医生签约的小程序项目.记录总结一下,开发过程中遇到的一些问题. 关于页面进栈出栈的状态值问题 页面进出栈,会触发onLoad/unLoad事件.出栈不 ...

  5. 单细胞分析实录(18): 基于CellPhoneDB的细胞通讯分析及可视化 (上篇)

    细胞通讯分析可以给我们一些细胞类群之间相互调控/交流的信息,这种细胞之间的调控主要是通过受配体结合,传递信号来实现的.不同的分化.疾病过程,可能存在特异的细胞通讯关系,因此阐明这些通讯关系至关重要. ...

  6. erase

    erase详细解释及原理 我们先定义一个字符串string string.erase(iterator) iterator表示要删除元素的迭代器. string.erase(it_begin,it_e ...

  7. SuperEdge 高可用云边隧道有哪些特点?

    作者 作者李腾飞,腾讯容器技术研发工程师,腾讯云TKE后台研发,SuperEdge核心开发成员. 背景 在边缘集群中,边缘端和云端为单向网络,云端无法主动连接边缘端,常见的解决方案是边缘端主动和云端( ...

  8. Spring Cloud分区发布实践(6)--灰度服务-根据Header选择实例区域

    此文是一个完整的例子, 包含可运行起来的源码. 此例子包含以下部分: 网关层实现自定义LoadBalancer, 根据Header选取实例 服务中的Feign使用拦截器, 读取Header Feign ...

  9. 自行搭建网站和APP统计平台

    做过网站运营分析的朋友,一定知道 Google 统计.友盟统计以及百度统计,它们都是非常优秀的统计平台. 但不管怎么样,数据并没有掌握在网站拥有者的手中.有时候,某些业务场景不适合使用第三方统计平台, ...

  10. Vue学习笔记(二)动态绑定、计算属性和事件监听

    目录 一.为属性绑定变量 1. v-bind的基本使用 2. v-bind动态绑定class(对象语法) 3. v-bind动态绑定class(数组语法) 4. v-bind动态绑定style(对象语 ...