`

启动三个线程循环打印ABC10次

 
阅读更多
package com.study.thread;

/**
 *
 * @author nirvana
 */
public class MyThreadPrinter {

    public static void main(String[] args) {

        MyLock lock = new MyLock();

        Thread a = new Thread(new MyPrinter("A", "B", lock));
        Thread b = new Thread(new MyPrinter("B", "C", lock));
        Thread c = new Thread(new MyPrinter("C", "A", lock));

        a.start();
        b.start();
        c.start();

        lock.setHolder("A");
    }

    static class MyPrinter implements Runnable {

        private String myName;
        private String nextName;
        private final MyLock lock;

        public MyPrinter(String myName, String nextName, MyLock lock) {
            this.myName = myName;
            this.nextName = nextName;
            this.lock = lock;
        }

        public void run() {
            int count = 10;
            while (count > 0) {
                //
                if (lock != null && lock.getHolder() != null && lock.getHolder().equals(myName)) {
                    synchronized (lock) {
                        System.out.println(myName);
                        count--;
                        lock.setHolder(nextName);
                    }
                }

            }
        }
    }

    static class MyLock {

        public MyLock() {
        }
        private String holder;

        public String getHolder() {
            return holder;
        }

        public void setHolder(String holder) {
            this.holder = holder;
        }
    }
}

第二种实现
public class Test implements Runnable {

	private static char[] chars = new char[] { 'A', 'B', 'C' };
	private static Integer index = 0; // 临界资源
	private int count = 10;

	public static void main(String[] args) {
		new Thread(new Test()).start();
		new Thread(new Test()).start();
		new Thread(new Test()).start();
	}

	public void run() {
		while (true) {
			synchronized (index) {
				if (index == 3*count)
				{
					return;
				}
				System.out.println(chars[index % 3]);
				index++;
			}
		}
	}
}
分享到:
评论

相关推荐

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

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

    java代码-三个线程轮流输出abc

    在这个问题中,有三个线程分别代表A、B、C三个角色,它们需要按照特定顺序(ABC、BCA、CAB、...)交替打印字符。为了实现这个功能,开发者通常会用到Java的线程同步机制,如synchronized关键字、wait()和notify()...

    线程分解详细

    在这个场景中,我们的目标是创建三个线程,分别对应线程ID A、B、C,使得它们在屏幕上循环打印10次"ABC"。这将涉及到线程同步、线程通信以及线程执行顺序控制。 首先,我们需要理解线程的基本概念。线程是操作系统...

    java多线程实现有序输出ABC

    我们首先创建一个ReentrantLock对象,然后创建三个Condition对象,每个Condition对象对应一个线程。 在每个线程中,我们使用lock()方法来获取锁,然后使用await()方法来等待当前Condition对象的signal()方法的唤醒...

    线程按指定顺序输出字符到数组的实例代码

    有三个线程,线程1的功能就是向字符数组输出A,线程2的功能就是向字符数组输出B,线程2的功能就是向字符数组输出C,要求按顺序向数组赋值ABCABCABC,ABC的个数由线程函数1的参数指定。 接口说明: void Init(); //...

    java_abc.zip_ABC

    在这个名为"java_abc.zip_ABC"的压缩包里,我们有一个名为"java_abc.docx"的文档,这很可能是一个详细的Java学习指南,可能包含了丰富的图文解释。 Java的学习路线通常会从基础开始,包括语法、变量、数据类型、...

    ABC.rar_ABC

    标题 "ABC.rar_ABC" 暗示我们关注的是一个与编程相关的压缩文件,可能是包含源代码或教程资料的RAR格式包。描述中提到的“VC++实现像输入法一样的无标题浮动窗口,拼音输入法窗口的实现”是该压缩包内的主要内容,这...

    java面试宝典

    71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() ...

    visual c++实现输入法窗口,类似智能ABC输入法

    总的来说,使用VC++实现类似智能ABC输入法的项目,涉及到Windows编程、多线程、字符串处理、算法设计等多个方面,是一个综合性的编程挑战。通过这样的实践,开发者不仅可以提升C++编程能力,还能深入了解输入法的...

    Java全国自考历年试卷(参考答案).doc

    正确答案是 `B.***`,因为在初始情况下 `x` 的值为10,循环会执行3次(10, 9, 8)。 ### 二、面向对象编程 3. **对象引用和复制**: - 在题目给出的代码示例中,`u` 和 `v` 是两个不同的 `U` 类的对象实例。选项B...

    最新Java面试宝典pdf版

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...

    2021-2022计算机二级等级考试试题及答案No.9060.docx

    - 对于给定的C语言程序示例,其输出结果为`m=23 n=456`(选项C),这是因为`scanf`函数中的格式控制字符串`"%2d%3d"`指定了读取两个整数,第一个整数由前两位组成,第二个整数由接下来的三位组成。 13. **Java修饰...

    Java全国自考历年试卷答案.doc

    初始值x=10,因此循环会执行三次,打印三个星号。因此,输出结果是B.***。 3. 内存回收:在Java中,对象引用的变化可能影响内存回收。选项B(u=v)会导致u指向v的对象,可能导致原来的u对象变成无引用状态,从而...

    JME试题及答案 socket 多线程 高级UI

    - **解析**:2D游戏循环主要包括更新、渲染和游戏逻辑处理三个基本步骤,通常不会包含单独的“输入”环节。 #### 三、判断题知识点解析 **1. TiledLayer中单元格的大小与Tile的大小关系** 正确选项为 **A**:True...

    ABC:ABC = Algoritmo蜜蜂殖民地

    ABC算法的核心思想是模拟蜜蜂社会的三个基本角色:工蜂、侦察蜂和蜂巢。 1. 工蜂阶段:工蜂代表解决问题的个体,它们随机搜索可能的解决方案(花粉源),并根据找到的解决方案质量(花粉源的甜度)更新自己的搜索...

    Java面试宝典2012版

    51、启动一个线程是用run()还是start()? . 33 52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 33 53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、...

    Java面试宝典2012新版

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43...

    java面试宝典2012

    51、启动一个线程是用run()还是start()? . 37 52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 37 53、线程的基本概念、线程的基本状态以及状态之间的关系 37 54、简述...

    Java面试宝典-经典

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...

Global site tag (gtag.js) - Google Analytics