`
li8754528
  • 浏览: 5209 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

三个线程ABC循环打印出ABCABCABCABC

    博客分类:
  • Java
阅读更多
有三个线程A,B,C 循环10次打印出三个线程的名字ABCABCABCABCABCABCABCABCABCABC

package com.lyl.test.thread;

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

public class ThreadTest {
	private Lock lock = new ReentrantLock();
	private Condition conditionA = lock.newCondition();
	private Condition conditionB = lock.newCondition();
	private Condition conditionC = lock.newCondition();
	private String threadPrintName = "A";

	class A implements Runnable {
		public void run() {
			try {
				lock.lock();
				for (int i = 0; i < 10; i++) {
					while (!Thread.currentThread().getName()
							.equals(threadPrintName)) {
						conditionA.await();
					}
					System.out.print(Thread.currentThread().getName());
					threadPrintName = "B";
					conditionB.signal();
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				lock.unlock();
			}

		}
	}

	class B implements Runnable {
		public void run() {
			try {
				lock.lock();
				for (int i = 0; i < 10; i++) {
					while (!Thread.currentThread().getName()
							.equals(threadPrintName)) {
						conditionB.await();
					}
					System.out.print(Thread.currentThread().getName());
					threadPrintName = "C";
					conditionC.signal();
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				lock.unlock();
			}
		}
	}

	class C implements Runnable {
		public void run() {
			try {
				lock.lock();
				for (int i = 0; i < 10; i++) {
					while (!Thread.currentThread().getName()
							.equals(threadPrintName)) {
						conditionC.await();
					}
					System.out.print(Thread.currentThread().getName());
					threadPrintName = "A";
					conditionA.signal();
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				lock.unlock();
			}
		}
	}

	public static void main(String[] args) {
		ThreadTest tt = new ThreadTest();
		Thread t1 = new Thread(tt.new A());
		Thread t2 = new Thread(tt.new B());
		Thread t3 = new Thread(tt.new C());
		t1.setName("A");
		t2.setName("B");
		t3.setName("C");
		t1.start();
		t2.start();
		t3.start();
	}
}
分享到:
评论

相关推荐

    java多线程每个线程挨着打印ABC的4种实现方式

    java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...

    Qt案例之利用QThread类实现简单多线程案例循环打印数字.zip

    Qt案例之利用QThread类实现简单多线程案例循环打印数字,可参考文章:https://blog.csdn.net/didi_ya/article/details/122661092

    多线程依次循环打印26个英文字母

    在这个"多线程依次循环打印26个英文字母"的问题中,我们主要关注如何在多个线程之间同步操作,确保字母按照顺序正确地输出。这里涉及了`条件队列`和`lock`两个关键概念。 首先,让我们理解一下`多线程`。在单核...

    易语言启动线程+循环+延时=时钟(循环)源码,易语言启动线程+循环+

    在易语言中,“启动线程”、“循环”和“延时”是三个重要的编程概念,它们在创建实时、响应式的程序中起到关键作用。 首先,我们要理解“启动线程”。在计算机编程中,线程是程序执行的最小单元,每个线程代表了...

    Java中一个线程执行死循环有什么后果

    在上述示例中,如果将同步对象改为this,那么线程A的死循环会阻止线程B执行,因为此时两个方法同步的是同一个对象,形成了互斥。 总的来说,Java中线程执行死循环会消耗大量的CPU资源,可能导致其他线程无法及时...

    启动两个线程,一个线程打印1~52,另一个线程打印A~Z

    启动两个线程,一个线程打印1~52,另一个线程打印A~Z

    MFC线程自定义消息循环

    默认情况下,MFC应用程序会为主线程创建一个消息循环,但当创建新线程时,这个新线程不会自动包含消息循环。因此,为了在线程中处理这些消息,我们需要手动为线程添加自定义的消息循环。 要在线程中创建自定义的...

    多线程与循环队列

    在计算机科学中,多线程和循环队列是两个重要的概念,它们在高效并发编程中发挥着关键作用。本文将详细探讨多线程环境下的循环队列应用。 首先,我们来理解多线程。多线程是一种编程模型,允许一个程序同时执行多个...

    3个线程,根据自定义规则打印线程名称

    编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C。 如果要求打印 ABCBCACAC,线程对应打印信息到控制台。 弊端:耗费cpu

    Java多线程连续打印abc实现方法详解

    Java多线程连续打印abc实现方法详解是 Java 编程语言中的一种常见问题,旨在解决三个线程同时执行,要求打印出10个连着的abc的难题。该问题的解决方案需要使用同步机制来确保三个线程的顺序执行。 知识点一:多线程...

    java多线程实现轮流打印ABC

    使用多线程和阻塞队列实现了ABC字母按顺序轮流打印

    自定义线程消息循环

    在计算机编程中,尤其是Windows API或MFC框架下,线程消息循环是一个核心概念,用于处理线程内的消息。线程消息循环允许线程接收和处理来自其他线程或者系统的消息,这些消息可能是用户交互、系统事件或者其他线程...

    创建一个带三个子线程的程序,第一个线程启动10ms后

    创建一个带三个子线程的程序,第一个线程启动10ms后,第二个线程再启动,然后再等待10ms后第三个线程启动,每一个线程从1—1000循环输出线程的名称和计数,当三个线程结束时要输出各自的结束信息,然后主线程结束。

    线程异步工作,当一个线程结束时异步通知另一线程

    一个线程在结束时修改原子变量,另一个线程则在循环中不断检查该变量,一旦发现状态改变,即可进行后续操作。 在`ThreadAsynTeamwork.cpp`和`ThreadAsynTeamwork.h`文件中,可能包含了一个实现此类异步通知的示例。...

    多线程读写问题循环buffer

    本示例中的“多线程读写问题循环buffer”着重探讨了如何在多个线程之间安全地共享一个循环缓冲区,以实现高效的数据交换。 首先,我们需要理解“循环buffer”的概念。循环缓冲区是一种内存管理策略,它利用数组或...

    C#生成线程与循环的源码

    C#创建线程与循环的例子,此为演示代码,创建新线程,并创建ThreadStart委托对象,消息传输方法AddMsg,在方法中使用循环实现传输功能,在循环中创建线程,在循环中创建并使用线程,传输一行,并将该行删除,点击...

    qt 多线程 防止主线程做循环操作导致界面假死

    例如,定义一个信号`emit newDataAvailable(data)`,在子线程的循环操作中发出,主线程连接该信号并更新界面。 4. 安全退出子线程 当不再需要子线程时,不要直接调用`thread.quit()`或`thread.terminate()`,这些...

    用C#实现的多线程同步打印文章(windows操作系统实验)

    这个实验的核心是创建两个独立的线程,一个用于文章的下载,另一个用于文章的打印,同时利用线程同步机制确保数据的安全与正确性。 首先,让我们了解一下多线程的概念。在计算机编程中,线程是程序执行的基本单元,...

    易语言启动线程中的延时循环

    例如,可能需要在一个循环中反复执行某段代码,并在每次循环后使用"延时"命令让线程休眠一段时间。 3. 控制循环的退出:当达到预设条件(如循环次数、外部信号等)时,结束循环并退出线程。 4. 线程结束时,记得使用...

    JAVA多线程运用

    1. 建立三个线程,并且同时运行它们。当运行时输出线程的名称。 实验步骤: (1)、创建类sy6_1 (2)、创建三个线程,调用start()方法启动这三个线程 (3)、保存文件,调试并编译运行程序。 参考程序运行效果: 2....

Global site tag (gtag.js) - Google Analytics