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 编程语言中的一种常见问题,旨在解决三个线程同时执行,要求打印出10个连着的abc的难题。该问题的解决方案需要使用同步机制来确保三个线程的顺序执行。 知识点一:多线程...
在这个问题中,有三个线程分别代表A、B、C三个角色,它们需要按照特定顺序(ABC、BCA、CAB、...)交替打印字符。为了实现这个功能,开发者通常会用到Java的线程同步机制,如synchronized关键字、wait()和notify()...
在这个场景中,我们的目标是创建三个线程,分别对应线程ID A、B、C,使得它们在屏幕上循环打印10次"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.docx"的文档,这很可能是一个详细的Java学习指南,可能包含了丰富的图文解释。 Java的学习路线通常会从基础开始,包括语法、变量、数据类型、...
标题 "ABC.rar_ABC" 暗示我们关注的是一个与编程相关的压缩文件,可能是包含源代码或教程资料的RAR格式包。描述中提到的“VC++实现像输入法一样的无标题浮动窗口,拼音输入法窗口的实现”是该压缩包内的主要内容,这...
71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() ...
总的来说,使用VC++实现类似智能ABC输入法的项目,涉及到Windows编程、多线程、字符串处理、算法设计等多个方面,是一个综合性的编程挑战。通过这样的实践,开发者不仅可以提升C++编程能力,还能深入了解输入法的...
正确答案是 `B.***`,因为在初始情况下 `x` 的值为10,循环会执行3次(10, 9, 8)。 ### 二、面向对象编程 3. **对象引用和复制**: - 在题目给出的代码示例中,`u` 和 `v` 是两个不同的 `U` 类的对象实例。选项B...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...
- 对于给定的C语言程序示例,其输出结果为`m=23 n=456`(选项C),这是因为`scanf`函数中的格式控制字符串`"%2d%3d"`指定了读取两个整数,第一个整数由前两位组成,第二个整数由接下来的三位组成。 13. **Java修饰...
初始值x=10,因此循环会执行三次,打印三个星号。因此,输出结果是B.***。 3. 内存回收:在Java中,对象引用的变化可能影响内存回收。选项B(u=v)会导致u指向v的对象,可能导致原来的u对象变成无引用状态,从而...
- **解析**:2D游戏循环主要包括更新、渲染和游戏逻辑处理三个基本步骤,通常不会包含单独的“输入”环节。 #### 三、判断题知识点解析 **1. TiledLayer中单元格的大小与Tile的大小关系** 正确选项为 **A**:True...
ABC算法的核心思想是模拟蜜蜂社会的三个基本角色:工蜂、侦察蜂和蜂巢。 1. 工蜂阶段:工蜂代表解决问题的个体,它们随机搜索可能的解决方案(花粉源),并根据找到的解决方案质量(花粉源的甜度)更新自己的搜索...
51、启动一个线程是用run()还是start()? . 33 52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 33 53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43...
51、启动一个线程是用run()还是start()? . 37 52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 37 53、线程的基本概念、线程的基本状态以及状态之间的关系 37 54、简述...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...