用三个线程循环输出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 ...
随机推荐
- 2017北京国庆刷题Day7 afternoon
期望得分:100+30+100=230 实际得分:60+30+100=190 排序去重 固定右端点,左端点单调不减 考场上用了二分,没去重,60 #include<cstdio> #inc ...
- Spring Boot 使用IntelliJ IDEA创建一个web开发实例(一)
.新建项目File-->New-->Project-->Spring Initializr 点击Finish,一个Spring Boot web应用就创建好了.
- Nodejs文件监控chokidar
最近有个需求是扫描用例,用例是放在svn上,如果每次扫描都去遍历目录的话会有占用太多的io,所以想着用文件监控,有文件变化时只对该文件进行操作. Nodejs里的 chokidar 模块可以更好的对文 ...
- (4.2)基于LingPipe的文本基本极性分析【demo】
酒店评论情感分析系统(四)—— 基于LingPipe的文本基本极性分析[demo] (Positive (favorable) vs. Negative (unfavorable)) 这篇文章为Lin ...
- wepy 使用组件时一个注意事项。。。
组件传值prop 必须使用指定引用地址的数据 如果像下面这样 取为空shop 中的phone ,后续获取数据或就算 shop中有phone元素 子组件也无法获取到修改后的值 <template& ...
- mysql数据库 批量替换 某字段中的数据
当数据库出现这种情况: 表名:area id name 1 太仓 2 太仓市 3 太仓市 ... ... 我需要把 name字段中 的太仓市 的“市“去掉 可以使用: update `area` ...
- 避免无用的渲染绘制(Avoiding Unnecessary Paints)
本文翻译自html5rock上的文章,文章英文原版地址在最后给出. 文中的Paints我翻译成渲染绘制,我自己是这么理解. 开始 绘制(渲染)一个网站或者一个应用的元素对浏览器来说开销是很大的,它会对 ...
- JS设计模式——2.初识接口
什么是接口 接口提供了一种用以说明一个对象应该具有哪些方法的手段. 接口之利 1.接口具有自我描述性从而促进代码的重用 2.接口有助于稳定不同中的类之间的通信方式 3.测试和调试也变得更轻松 接口之弊 ...
- Test plan
Options for Test Strategy: 1. Regular test: all the planned test cases will be executed 2. Extented ...
- sqlmap的使用方法 ——时光凉春衫薄
普通注入 Sqlmap -u “http://www.xxxxxx.com/xxxx/xxx/xxx.xxx?xx=xx” --dbs 找到一个sql的注入点 探测他的库名 access的直接探表 ...