zoukankan      html  css  js  c++  java
  • 线程按序交替

    编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,

    每个线程将自己的 ID 在屏幕上打印 10 遍,要 求输出的结果必须按顺序显示

    TestABCAlternate

    package com.aff.juc;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class TestABCAlternate {
        public static void main(String[] args) {
            AlternateDemo ad = new AlternateDemo();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 1; i <= 20; i++) {
                        ad.loopA(i);
                    }
                }
            },"A线程").start();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 1; i <= 20; i++) {
                        ad.loopB(i);
                    }
                }
            },"B线程").start();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 1; i <=20; i++) {
                        ad.loopC(i);
                        System.out.println("=============================");
                    }
                }
            },"C线程").start();
    
        }
    }
    
    class AlternateDemo {
        private int number = 1;
        private Lock lock = new ReentrantLock();
        private Condition condition1 = lock.newCondition();
        private Condition condition2 = lock.newCondition();
        private Condition condition3 = lock.newCondition();
    
        // totalLoop :循环几轮
        public void loopA(int totalLoop) {
            lock.lock();
            try {
                // 1. 判断
                if (number != 1) {
                    condition1.await();
                }
                // 2.打印
                for (int i = 1; i <= 2; i++) {
                    System.out.println(Thread.currentThread().getName() + 
    " " + i +" "+ " " + totalLoop); } // 3.唤醒 number = 2; condition2.signal();// number为2 唤醒condition2 } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void loopB(int totalLoop) { lock.lock(); try { // 1. 判断 if (number != 2) { condition2.await(); } // 2.打印 for (int i = 1; i <= 2; i++) { System.out.println(Thread.currentThread().getName() +
    " " + " "+ i + " " + totalLoop); } // 3.唤醒 number = 3; condition3.signal();// number为3 唤醒condition3 } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void loopC(int totalLoop) { lock.lock(); try { // 1. 判断 if (number != 3) { condition3.await(); } // 2.打印 for (int i = 1; i <= 2; i++) { System.out.println(Thread.currentThread().getName() +
    " " + " "+ i + " " + totalLoop); } // 3.唤醒 number = 1; condition1.signal();// number为1 唤醒condition1 } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } }
    All that work will definitely pay off
  • 相关阅读:
    ASP.NET26 个常用性能优化方法
    git 合并 二进制文件
    git 状态管理
    git 分支管理,提交到远程服务器上面
    git 发布android 系统版本 修改版本型号 查看指定文件的修改记录
    使用git 发布android系统版本 1
    提取文本当中的汉字
    wpf 命名空间中不存在
    c# 调用c DLL 所传参数不正确
    用于主题检测的临时日志(233d1263-3c3c-43d0-a2fd-318ee6fd58db
  • 原文地址:https://www.cnblogs.com/afangfang/p/12632559.html
Copyright © 2011-2022 走看看