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
  • 相关阅读:
    sharepoint无法到搜索人员
    sharepoint 自定义操作 CustomAction
    sharepoint 自定列表总结
    向数据表中插入字符序号,例如"001""002"
    通过sharepoint 客户脚本,验证列表添加页面上的时间
    WebService入门(1)
    Java虚拟机1:什么是Java
    SFTP服务搭建
    Shell学习——特殊变量
    js知识点~扁平数据结构转Tree
  • 原文地址:https://www.cnblogs.com/afangfang/p/12632559.html
Copyright © 2011-2022 走看看