`
jrkui
  • 浏览: 10415 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用java多线程顺序打印“ABCABC”

 
阅读更多
今天看到这么一道多线程题:有三个线程,每个线程有一个属性flag,假设每个线程的flag值顺序为“A”、“B”、“C”,编写一段代码在控制台顺序输出“ABCABC”。

因为线程执行不是按顺序执行的,如果需要按顺序执行,则需要加锁。现在设想有一个对象“lock”作为这三个线程共用的锁,“lock”控制每个线程的“输出flag值到控制台”的代码。每个线程在start后,都需要去检查是否获得了”lock“的锁(锁的分配是都虚拟机分配的,貌似),如果获得了锁,则执行相关代码,如果没有获得锁,则挂起,等待系统下次调用。

示例代码
package com.jrkui.thread;

public class OrderPrintThread extends Thread{
	private Lock lock;
	private String flag;
	
	public OrderPrintThread(String flag, Lock lock) {
		this.flag = flag;
		this.lock = lock;
	}
	
	@Override
	public void run() {
		int count = 2;
		while(count > 0)
		{
			synchronized (lock) {
				if(lock.getFlag().equals(flag))
				{
					System.out.print(flag);
					count--;
					
					if("A".equals(flag))
						lock.setFlag("B");
					else if("B".equals(flag))
						lock.setFlag("C");
					else if("C".equals(flag))
						lock.setFlag("A");
				}
			}
		}
	}
	
	public static void main(String[] args) {
		Lock lock = new Lock();
		lock.setFlag("A");
		OrderPrintThread thread1 = new OrderPrintThread("A", lock);
		OrderPrintThread thread2 = new OrderPrintThread("B", lock);
		OrderPrintThread thread3 = new OrderPrintThread("C", lock);
		
		thread1.start();
		thread2.start();
		thread3.start();
	}
}

class Lock 
{
	private String flag;
	
	public void setFlag(String flag) {
		this.flag = flag;
	}
	
	public String getFlag() {
		return flag;
	}
}

synchronized关键字就是为”lock“对象加锁。加上synchronized关键字后,每次只能有一个线程调用被加锁的代码段(变量,方法)。
分享到:
评论

相关推荐

    java信号量控制线程打印顺序的示例分享

    使用信号量能有效地解决多线程间的同步问题,防止资源的竞争条件,确保特定的执行顺序。在这个示例中,通过巧妙地分配和释放信号量,实现了线程A、B、C按特定顺序打印字符,避免了可能的乱序输出。 5. **应用场景...

    <一>、C++实现多线程的同步处理:控制ABC的输出顺序,输出10组,mutex+condition-variable源码示例

    要在标准C++中使用多线程,可以使用类 thread,3条线程,我们可以直白一些,直接实现3个线程函数,在函数里面进行循环输出对应字符,每个循环控制10次即可;同时,要想控制输出顺序的话,最开始想到的方式是直接加一...

    <二>、C++实现多线程的同步处理:控制ABC的输出顺序,输出10组,mutex+condition-variable源码示例

    有三条线程,可以分别输出A、B、C字符,现想办法控制输出顺序,使得顺序为ABCABC......ABC[共10组],并且每条线程只能启动一次,不能多次启动。 需要3条线程输出不同的字符,分别为A、B、C,并且顺序要固定住:...

    浅谈Python3多线程之间的执行顺序问题

    在给出的标题和描述中,提出了一个具体的问题:如何控制三个线程按照特定的顺序(ABCABC…)打印它们的线程ID。这个问题的关键在于同步机制,也就是如何确保线程间按照特定顺序执行。 在提供的代码中,使用了`...

    迅雷技术招聘java试题

    题目要求实现线程交替打印"ABCABC…",这通常需要使用同步机制,如synchronized关键字或wait/notify机制。 【字符串处理】 题目要求移除字符串中的特定字符,而不使用内置字符串方法。可以使用字符数组遍历并构建新...

    【并发编程】 — 线程间的通信wait、notify、notifyAll

    三个线程顺序打印问题2.1.1 题目2.1.2 题目分析2.1.3 我的答案2.2 生产者消费者问题2.2.1 题目2.2.2 题目分析2.2.3 我的答案 源码地址:https://github.com/nieandsun/concurrent-study.git 1 wait、notify、...

    JAVA正则表达式--Pattern和Matcher

    在上述示例中,使用了 `Pattern.compile("[/]+")` 编译了一个正则表达式,用于匹配一个或多个斜杠 `/` 字符。然后使用 `split()` 方法将字符串按照 `/` 字符进行分割。通过修改 `split` 方法的第二个参数 `limit` 为...

    计算机JAVA程序和平日练习

    12. **Java 抽象类与接口**:Java 中,方法的重载允许同一类中有多个同名但参数列表不同的方法;abstract 修饰的类是抽象类,不能被实例化;接口是完全抽象的,不包含成员变量的初始化和方法实现;构造方法在 Java ...

    计算机笔试题库集(含有答案)

    题中提到的实现三个线程循环打印“ABCABC…”,可以通过继承Thread类或实现Runnable接口,并使用synchronized关键字控制同步,确保打印顺序。 6. **字符串处理**:去除字符串中特定字符,不使用内置方法,可以...

    云erp源码java-Java-:Java-

    云erp源码 java progress教程 ssm框架整合 ssm整合简例 ssm整合activemq Java虚拟机 码云开源ERP项目(财务) 易源数据 别人的笔记 程序员外包接单 ...密码:abcABC123 ...多线程读写文件 springboot整合其他软件技术

    JAVA 正则表达式总结_V2

    - **分组与反向引用**:使用圆括号`()`创建分组,可以通过`\数字`进行反向引用,如 `(abc)\1` 将匹配 "abcabc"。 - **选择分支**:`|` 符号用于表示多个选项,如 `a|b` 可匹配 'a' 或 'b'。 - **预定义字符类**:...

    zuoye03.java

    编写自定义的字符串一致性匹配方法,只要两个字符串包含同样的字符,不管字符的顺序如何,都认为两个字符串一致,如:”aabbcc”和”abcabc”被认为是一致的

    2022java开发博华广场-国泰君安资产托管部数据岗笔试题.docx

    这篇文档是关于2022年国泰君安资产托管部数据岗位的Java开发笔试题,主要涵盖了Java语言的基础知识,包括对象的相等性、字符串的比较以及SQL的插入语句。 首先,题目考察了Java中基本类型与包装类的相等性。在Java...

    在Java编程中使用正则表达式的基本方法

    在Java中,自JDK 1.4起,引入了java.util.regex包,使得Java程序可以方便地使用正则表达式。java.util.regex包中的主要类有Pattern和Matcher。Pattern类用于编译正则表达式,生成一个模式对象。Matcher类用于对输入...

    cpp代码-abcabc.cpp

    标题 "cpp代码-abcabc.cpp" 暗示我们正在讨论一个C++源代码文件,可能是一个特定功能的实现或示例。描述同样简洁,没有提供额外的信息,所以我们主要依赖标签和子文件来推测可能的知识点。 标签 "代码" 明确地告诉...

    Java 中的 String对象为什么是不可变的

    1. **线程安全**:由于String对象不可变,所以在多线程环境中,多个线程可以安全地共享同一个String对象,无需担心同步问题。这提高了程序的并发性能。 2. **缓存哈希码**:String对象经常用于HashMap等数据结构中...

    LZ77数据无损压缩算法,可以直接运行

    它由Abraham Lempel、Jacob Ziv和Stanley Welch于1977年提出,是LZW(Lempel-Ziv-Welch)算法的基础,但LZ77本身并不涉及编码过程,通常与霍夫曼编码或其他熵编码结合使用以生成可执行的压缩文件。LZ77的核心思想是...

    ABCabcadbc

    sferfrefwefeqrfrefref

Global site tag (gtag.js) - Google Analytics