第一种

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. Python报错“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)”的解决办法

    最近在用Python处理中文字符串时,报出了如下错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ...

  2. 脱离OBDeploy工具,手工部署OceanBase方法

    [简介] OBDeploy是OceanBase集群部署的工具,可以通过简单的几行命令,就能快速的进行OceanBase部署.但对于初学者来讲,可能会比较困惑,Deploy到底做了哪些事情?里面的具体步 ...

  3. jconsole和jstack

    1.jconsole jconsole是jdk自带的一个可视化的jvm监控工具,可以监控本地的jvm,也可以监控远程jvm 打开本地jdk安装目录下的bin目录下的jconsole.exe 2.jst ...

  4. c语言:sprintf() 数字转字符赋值给数组

    //sprintf() //sprintf 最常见的应用之一是把整数打印到字符串中,所以,spritnf 在大多数场合可以替代itoa /* 缓冲区溢出 第一个参数的长度太短了,没的说,给个大点的地方 ...

  5. Abp太重了?轻量化Abp框架

    本文首发于个人博客(https://blog.zhangchi.fun/) 在进行框架的选型时,经常会听到"***框架太重了"之类的声音,比如"Abp太重了,不适合我们. ...

  6. Requests方法 -- 关联用例执行

    1.参照此篇流程 :Requsts方法 -- Blog流程类进行关联 2.用例接口目录如下: 3.用例代码如下: import requestsimport unittestfrom Request. ...

  7. C++ Primer Plus 第四章 复合类型 学习笔记

    第四章 复合类型 1. 数组概述 1.1 数组的定义 数组(array)是一种数据格式,能够存储多个同类型的值.每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素. 数组声明的三 ...

  8. webpack 安装使用简例

    1. 新建项目文件夹,如 webpack-demo 2. cd 到安装项目根目录,即进入webpack-demo文件夹,命令行工具输入"npm install webpack webpack ...

  9. Java 中 this 和 super 的用法详解

    前言 这次我们来回顾一下this和super这两个关键字的用法,作为一名Java程序员,我觉得基础是最重要的,因为它决定了我们的上限,所以我的文章大部分还是以分享Java基础知识为主,学好基础,后面的 ...

  10. sessionfilter中的拦截项判断