用三个线程循环输出ABC
前两天看Java吧有人求助这个问题。想了想并不是很难。今天就顺手实现了一下。
我自己想到的有两种方法,一个是使用synchronized,一个是使用lock。
一、synchronized
package com.test; public class PrintABC { private static int count = 0; public static void main(String[] args) {
String str = "ABC";
PrintABC printABC = new PrintABC();
ThreadA threadA = printABC.new ThreadA(str);
ThreadB threadB = printABC.new ThreadB(str);
ThreadC threadC = printABC.new ThreadC(str);
threadA.start();
threadB.start();
threadC.start();
} /**
* 打印A
* @author LKB
*
*/
class ThreadA extends Thread{ private String str; public ThreadA(String str) {
// TODO Auto-generated constructor stub
this.str = str;
} public void run(){
while(count < 28){
synchronized (str) {
if(count%3 == 0){
System.out.println("A");
count++;
}
}
}
}
} /**
* 打印B
* @author LKB
*
*/
class ThreadB extends Thread{ private String str; public ThreadB(String str) {
// TODO Auto-generated constructor stub
this.str = str;
} public void run(){
while(count < 29){
synchronized (str) {
if(count%3 == 1){
System.out.println("B");
count++;
}
}
}
}
} /**
* 打印C
* @author LKB
*
*/
class ThreadC extends Thread{ private String str; public ThreadC(String str) {
// TODO Auto-generated constructor stub
this.str = str;
} public void run(){
while(count < 30){
synchronized (str) {
if(count%3 == 2){
System.out.println("C");
System.out.println("++++++");
System.out.println("------");
count++;
}
}
}
}
} }
这个方法的关键是synchronized关键字的位置。把它放在while判断之下就OK了。如果把synchronized关键字放在while外,则一直在锁中无法跳出锁。
二、lock
package com.test; import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class PrintABC2 { private int count = 0;
private Lock lock = new ReentrantLock();
private Condition conditionA = lock.newCondition();
private Condition conditionB = lock.newCondition();
private Condition conditionC = lock.newCondition(); public static void main(String[] args) {
PrintABC2 printABC = new PrintABC2();
ThreadA threadA = printABC.new ThreadA();
ThreadB threadB = printABC.new ThreadB();
ThreadC threadC = printABC.new ThreadC();
threadA.start();
threadB.start();
threadC.start(); } /**
* 打印A
* @author LKB
*
*/
class ThreadA extends Thread{ public void run(){
try {
lock.lock();
while(count < 30){
if (count%3 != 0) {
conditionA.await();
}
System.out.println("A");
count ++;
conditionB.signalAll();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
lock.unlock();
System.out.println("ThreadA 中执行了 unlock");
}
}
} /**
* 打印B
* @author LKB
*
*/
class ThreadB extends Thread{ public void run(){
try {
lock.lock();
while(count < 30){
if (count%3 != 1) {
conditionB.await();
}
System.out.println("B");
count ++;
conditionC.signalAll();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
lock.unlock();
System.out.println("ThreadB 中执行了 unlock");
}
}
} /**
* 打印C
* @author LKB
*
*/
class ThreadC extends Thread{ public void run(){
try {
lock.lock();
while(count < 30){
if (count%3 != 2) {
conditionC.await();
}
System.out.println("C");
System.out.println("+++++++");
System.out.println("-------");
count ++;
if(count < 30){
conditionA.signalAll();
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
lock.unlock();
System.out.println("ThreadC 中执行了 unlock");
}
}
} }
lock方法相对而言就简单多了,不需要精妙地设计,只需要知道lock和condition的用法就好了。
在一个lock对象里可以创建多个Condition(即对象监视器)实例。线程对象可以注册到指定的Condition中,从而可以有选择性地进行线程通知。
用三个线程循环输出ABC的更多相关文章
- 使用Java 多线程编程 让三个线程轮流输出ABC,循环10次后结束
简要分析: 要求三个线程轮流输出,这里我们要使用一个对象锁,让关键部分的代码放入同步块当中.同时要有一个变量记录打印的次数到达10次循环后不再打印,另外一个就是要给每个线程一个标志号,我们根据标识号来 ...
- java Semaphore实现ABC三个线程循环打印
Semaphore位于java.util.concurrent包下.其中有两个重要的方法acquire()和release().acquire用来获取一个信号量,并且是阻塞型的,如果当前还有可用的信号 ...
- Java多线程:用三个线程控制循环输出10次ABC
转载:http://www.cnblogs.com/gaopeng527/p/5257884.html 题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个 ...
- Java多线程循环打印ABC的5种实现方法
https://blog.csdn.net/weixin_39723337/article/details/80352783 题目:3个线程循环打印ABC,其中A打印3次,B打印2次,C打印1次,循环 ...
- java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现
注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...
- java中使用ReentrantLock锁中的Condition实现三个线程之间通信,交替输出信息
本文直接附上源代码,如下是自己写的一个例子 面试题需求: 使用Condition来实现 三个线程 线程1 线程2 线程3 三个交替输出 [按照 线程1(main)-->线程2-->线程3] ...
- C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。
添加三个线程同时启动执行某一方法,并依次调用某方法中的打印输:ABC ABC ABC ABC 实现代码如下: using System; using System.Collections.Generi ...
- 斐讯面试记录—三线程交替打印ABC
package cn.shenzhen.feixun; public class PrintABC extends Thread{ private String name; private Objec ...
- 三个线程abc顺序执行
1.使用synchronized悲观锁(秋招阿里的一个笔试题,应该写的比较复杂,然后就没有然后了o(╥﹏╥)o) public class ThreadThreadp { private int fl ...
随机推荐
- [Thu Summer Camp 2015]解密运算
4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec Memory Limit: 512 MB Description 对于一个长度为N的字符串,我 ...
- 2-sat 分类讨论 UVALIVE 3713
蓝书326 //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using namespace std; ...
- 重构改善既有代码设计--重构手法18:Self Encapsulate Field (自封装字段)
你直接访问一个值域(field),但与值域之间的耦合关系逐渐变得笨拙. 为这个值域建立取值/设值函数(getting/setting methods),并且只以这些函数来访问值域. private i ...
- 使用纯 CSS 实现响应式的图片显示效果
有许多方法可以实现页面里图像的响应式显示(Responsive).然而,我碰到的所有方案都使用了JavaScript.这使我疑惑不用 JavaScript 实现图像响应是否可行. 我提出了下面纯CSS ...
- 谈谈"求线段交点"的几种算法(js实现,完整版)
"求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法总结一下, 希望对大家有所帮助. ...
- NYOJ 925 国王的烦恼 (并查集)
题目链接 描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能存在多座桥连接.然而,由于海水冲刷,有一些大桥面临着不能使用的危险.如 ...
- sublime出现卡顿的现象
这几天,用sublime总是写一个代码就卡顿,卡卡卡,,,,要死的~ 最后,才发现是因为安装了一个插件:GitGutter插件,所以,小伙伴们请跟上我的节奏~~~~~ (1)Ctrl + Shift ...
- Mac 下安装 ruby 环境解决 brew 安装 yarn 问题
在brew安装yarn提示 ruby的版本过低.在网上搜了一下发现 1. mac下自带的ruby 在 system 目录下 2. 其实可以用brew安装一个ruby brew install ruby ...
- CSS背景横向平铺BUG,解决方法
给定DIV一个背景图片横向平铺,缩小浏览器,拉动横向滚动条,此时触发此BUG:背景图片平铺不完整 解决办法: 1.把背景图片写在BODY上,此办法局限于没有使用iframe的情况下,所以少用 2.设定 ...
- HDU 3018 Ant Trip (并查集求连通块数+欧拉回路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3018 题目大意:有n个点,m条边,人们希望走完所有的路,且每条道路只能走一遍.至少要将人们分成几组. ...