案例 java并发编程应用实例

学习视频资料地址:

网盘资料地址:

 

代码示例十:

复制代码
package com.juchaosoft.test;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 线程按序交替
 * @author wang-xiaoming
 *
 */
public class TestAlternateABC10_01 {
    public static void main(String[] args) {
        AlternateDemo ad = new AlternateDemo();
        // 三个线程同时开启,循环十次并按照线程规定顺序打印ABC
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    ad.loopA(i, 1);
                }
            }
        }, "A").start();
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    ad.loopB(i, 2);
                }
            }
        }, "B").start();
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    ad.loopC(i, 3);
                    System.out.println("" + (i + 1) + "次执行结束。。");
                }
            }
        }, "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();
    
    public void loopA(int total, int times){
        lock.lock();
        
        try {
            // 1、判断线程
            while(number != 1){
                condition1.await();
            }
            // 2、打印
            for (int i = 0; i < times; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + total);
            }
            // 3、结束,唤醒下一个线程
            number = 2;
            
            condition2.signal();
        } catch (Exception e) {
            Thread.currentThread().interrupt();
        } finally {
            lock.unlock();
        }
    }
    
    public void loopB(int total, int times){
        lock.lock();
        
        try {
            // 1、判断线程
            while(number != 2){
                condition2.await();
            }
            // 2、打印
            for (int i = 0; i < times; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + total);
            }
            // 3、结束,唤醒下一个线程
            number = 3;
            
            condition3.signal();
        } catch (Exception e) {
            Thread.currentThread().interrupt();
        } finally {
            lock.unlock();
        }
    }
    
    public void loopC(int total, int times){
        lock.lock();
        
        try {
            // 1、判断线程
            while(number != 3){
                condition3.await();
            }
            // 2、打印
            for (int i = 0; i < times; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + total);
            }
            // 3、结束,唤醒下一个线程
            number = 1;
            
            condition1.signal();
        } catch (Exception e) {
            Thread.currentThread().interrupt();
        } finally {
            lock.unlock();
        }
    }
}
复制代码

console:

复制代码
A    0    0
B    0    0
B    1    0
C    0    0
C    1    0
C    2    0
第1次执行结束。。
A    0    1
B    0    1
B    1    1
C    0    1
C    1    1
C    2    1
第2次执行结束。。
A    0    2
B    0    2
B    1    2
C    0    2
C    1    2
C    2    2
第3次执行结束。。
A    0    3
B    0    3
B    1    3
C    0    3
C    1    3
C    2    3
第4次执行结束。。
A    0    4
B    0    4
B    1    4
C    0    4
C    1    4
C    2    4
第5次执行结束。。
A    0    5
B    0    5
B    1    5
C    0    5
C    1    5
C    2    5
第6次执行结束。。
A    0    6
B    0    6
B    1    6
C    0    6
C    1    6
C    2    6
第7次执行结束。。
A    0    7
B    0    7
B    1    7
C    0    7
C    1    7
C    2    7
第8次执行结束。。
A    0    8
B    0    8
B    1    8
C    0    8
C    1    8
C    2    8
第9次执行结束。。
A    0    9
B    0    9
B    1    9
C    0    9
C    1    9
C    2    9
第10次执行结束。。
复制代码
posted @   王晓鸣  阅读(734)  评论(1编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示