`
hacker_zxf
  • 浏览: 148283 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

顺序打印ABC,连续打10次

阅读更多
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LoopWaitThreadTest {

    static AtomicInteger count        = new AtomicInteger(0);

    private Lock         lock         = new ReentrantLock();
    private Condition    newCondition = lock.newCondition();

    public static void main(String[] args) {
        LoopWaitThreadTest test = new LoopWaitThreadTest();
        ThreadAAA a = test.new ThreadAAA("A");
        ThreadBBB b = test.new ThreadBBB("B");
        ThreadCCC c = test.new ThreadCCC("C");

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

    class ThreadAAA extends ThreadTemplates {

        public ThreadAAA(String name) {
            super(name);
        }

        public void dowork() {
            try {
                lock.lock();
                /**
                 * 当调用newCondition.signalAll()时,会从newCondition.await()后面继续执行
                 * 所以必须要来个循环,否则会因为某些线程的此次循环早早的结束,而某些数字不能够消费掉导致死锁 例如:
                 * A线程判断一个数字时,也许他还不满足条件,然后他等待,当其他线程调用signalAll时,该线程被唤醒,但是马上此次循环就结束了,因为await下面没有可以执行的
                 */
                while (true) {
                    System.out.println("lock A");
                    if (LoopWaitThreadTest.count.intValue() % 3 == 0) {
                        System.out.println("A.....");
                        LoopWaitThreadTest.count.incrementAndGet();
                        newCondition.signalAll();
                        break;
                    } else {
                        try {
                            System.out.println("A wait");
                            // 当被唤醒时,从该方法之后开始执行
                            newCondition.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                }

            } finally {
                System.out.println("unlock A");
                lock.unlock();
            }
        }
    }

    class ThreadBBB extends ThreadTemplates {

        public ThreadBBB(String name) {
            super(name);
        }

        public void dowork() {
            try {
                lock.lock();
                while (true) {
                    System.out.println("lock B");
                    if (LoopWaitThreadTest.count.intValue() % 3 == 1) {
                        System.out.println("B.....");
                        LoopWaitThreadTest.count.incrementAndGet();
                        newCondition.signalAll();
                        break;
                    } else {
                        try {
                            System.out.println("B wait");
                            newCondition.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }

            } finally {
                System.out.println("unlock B");
                lock.unlock();
            }

        }

    }

    class ThreadCCC extends ThreadTemplates {

        public ThreadCCC(String name) {
            super(name);
        }

        public void dowork() {
            try {
                lock.lock();
                System.out.println("lock C");
                while (true) {
                    if (LoopWaitThreadTest.count.intValue() % 3 == 2) {
                        System.out.println("C.....");
                        LoopWaitThreadTest.count.incrementAndGet();
                        newCondition.signalAll();
                        break;
                    } else {
                        try {
                            System.out.println("C wait");
                            newCondition.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            } finally {
                System.out.println("unlock C");
                lock.unlock();
            }
        }
    }

    abstract class ThreadTemplates extends Thread {

        public ThreadTemplates(String name) {
            super();
            this.setName(name);
        }

        abstract void dowork();

        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println("current count is " + LoopWaitThreadTest.count.intValue());
                dowork();
            }
        }

    }

}
分享到:
评论

相关推荐

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

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

    数据结构顺序表源码,能直接运行,供参考

    顺序表在内存中是连续存储的,它的每个元素都有一个固定的索引位置,通常是从0开始。这种存储方式使得随机访问变得非常快速,因为元素可以通过索引直接访问。然而,插入和删除操作可能比较慢,因为可能需要移动大量...

    linux命令大全(按首字母顺序_含详细说明及实例)

    例如,"ar -rv abc.a file1 file2"会将file1和file2添加到abc.a备存文件中。 2. at命令:用于在指定的时间执行一次性的任务。可以指定时间来运行命令或脚本。例如,"at 17:20 tomorrow"将指定在明天的17:20执行后续...

    11049 计算机软件技术.docx

    10. 打印缓冲区通常是一个队列结构,先进先出,确保数据按照顺序打印。 11. 循环队列中,删除一个元素后再加入两个元素,若初始rear=0,front=3,则操作后rear=2,front=4。 12. 栈的特性是后进先出,若a5=10,...

    数据结构实验报告.pdf

    在建立二叉树时,用户需按先序顺序输入节点,例如输入"ABC##DE#G##F###",其中'#'表示空节点。输入的字符串被用来构建二叉树,每个字符代表一个节点,连续的字符间无分隔符表示它们之间存在边连接。 实验的基本要求...

    数据结构课后习题答案

    - 然后连续两次`push`操作,分别将4和5压入栈中,栈顶指针变为1003H。 - 输出序列为23,最终栈顶指针为1003H。 **⑵ 栈通常采用的两种存储结构是(顺序存储结构和链接存储结构);其判定栈空的条件分别是(栈顶指针...

    (精品)大学C语言期末考试题及答案.pdf

    (x)&&(x&lt;10),因为C语言的逻辑表达式不支持连续比较。 3. 逻辑运算符的优先级从高到低是:!、&&、||。这意味着先计算非(!),再计算与(&&),最后计算或(||)。 4. printf函数用于输出格式化的字符串。正确使用示例:...

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

    顺序存储结构的数据元素存储在一块连续的内存区域,而链式存储结构的数据元素可以通过指针链接,不需连续存储。 2. 数据库操作:在数据库操作中,`OPEN DATABASE`命令用于打开数据库,例子中的`OPEN DATABASE abc`...

    (word完整版)2019年全国计算机二级考试试题题库(附答案).doc

    7. **八位二进制表示的十进制数**:能用八位二进制表示的无符号十进制数最大是255,因此只有199在这个范围内。 8. **计算机软件分类**:计算机软件系统主要分为系统软件和应用软件。系统软件包括操作系统、语言处理...

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

    正确答案是D“1.0/a/b/c”,因为在浮点数运算中,通过连续除以a、b、c可以得到期望的结果。 ### 25. 目录操作命令 **知识点说明**: - **目录操作命令**:在操作系统中用于创建、删除、重命名目录的命令。 - **...

    数据结构-3期(KC002) 链队列的基本运算.docx

    链队列是一种线性数据结构,它在物理存储单元上非连续、非顺序地存储数据元素,通过指针连接各个节点。在这个文档中,我们学习了如何使用链表实现链队列,包括链队列的基本运算:初始化、判断队列是否为空、入队、出...

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

    17. 打印预览可以在打印前查看实际的打印效果,帮助调整布局和设置。 18. VFP(Visual FoxPro)支持的常量类型包括数值型、字符型、日期型和逻辑型。 19. `Ctrl+V`是Windows中常用的粘贴快捷键。 20. `Math`类中...

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

    10. 文档保存:在Word中,打开文档ABC修改后另存为ABD,原文档ABC未被修改,保持原样,新保存的文档ABD包含修改。 11. 打开窗口控制菜单的快捷键:通常是Alt+Space。 12. 需求规格说明书作用:便于理解交流、反映...

    《操作系统概要》实验一

    这并没有改变并发执行的本质,但由于`printf()`函数会连续输出整个字符串,因此输出顺序将保持不变,只是每个进程打印的字符串长度增加。因此,屏幕可能显示"father, child, son",但同样,由于并发执行,实际的顺序...

    2014锐捷网络校园招聘c笔试题目

    18. `sprintf`的连续调用,字符串连接后输出是`abc100efg%d`,`printf`填充100。 19. 二叉树的前序遍历和中序遍历对应关系,可以推导出后序遍历是`dgebhfca`。 20. 插入元素时,需要移动`n-i+1`个元素。 21-25. `...

    2019年全国计算机二级考试题试题库附答案精选.doc

    19. **DOS命令等价性**:互相等价的DOS命令组是B) COPY ABC.TXT+XYZ.TXT 与 TYPE XYZ.TXT &gt;&gt; ABC.TXT,都是将XYZ.TXT内容追加到ABC.TXT文件末尾。 以上知识点涵盖了计算机基础知识、计算机维护、ASCII码、计算机...

    Upper-Alpha-Keyspace-Reducer:输出减少的8个高位字母字符的键空间

    只有符合以下条件的组合才会被打印: •每个角色出现的次数不能超过3次•连续3个字符不能相同•连续3个字符不能连续(ABC) •连续3个字符不能为反向顺序(CBA) •字符2不等于字符1 •字符2不是字符1的+1 •字符2...

    C语言编程题精选

    - **解析**:打印杨辉三角形的前10行,涉及到对杨辉三角形生成规律的理解,使用二维数组存储每一行的数据,以及循环结构控制打印格式。 #### 题目十六:学生成绩分析 - **知识点**:数组操作,条件判断,函数设计 -...

Global site tag (gtag.js) - Google Analytics