java线程之定制化通信(多轮顺序打印问题)

简介: java线程之定制化通信(多轮顺序打印问题)

一、任务

启用三个线程,打印3轮;

线程一t1,每轮打印1次;

线程二t2,每轮打印2次;

线程三t3,每轮打印3次;

线程:t1,第1轮,第1次打印
线程:t2,第1轮,第1次打印
线程:t2,第1轮,第2次打印
线程:t3,第1轮,第1次打印
线程:t3,第1轮,第2次打印
线程:t3,第1轮,第3次打印
线程:t1,第2轮,第1次打印
线程:t2,第2轮,第1次打印
线程:t2,第2轮,第2次打印
线程:t3,第2轮,第1次打印
线程:t3,第2轮,第2次打印
线程:t3,第2轮,第3次打印
线程:t1,第3轮,第1次打印
线程:t2,第3轮,第1次打印
线程:t2,第3轮,第2次打印
线程:t3,第3轮,第1次打印
线程:t3,第3轮,第2次打印
线程:t3,第3轮,第3次打印

二、实现

1、定义资源类及打印方法

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
public class Flag {
    int flag = 1;
    private final Lock lock = new ReentrantLock();
    Condition c1 = lock.newCondition();
    Condition c2 = lock.newCondition();
    Condition c3 = lock.newCondition();
 
    public void print1(int loop) {
        //加锁
        lock.lock();
        try {
            //判断条件
            while (flag != 1) {
                c1.await();
            }
            //执行任务
            for (int i = 0; i < 1; i++) {
                System.out.println(String.format("线程:%s,第%s轮,第%s次打印", Thread.currentThread().getName(), loop, i + 1));
            }
            //修改标志位
            flag = 2;
            //通知
            c2.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //解锁
            lock.unlock();
        }
    }
 
    public void print2(int loop) {
        //加锁
        lock.lock();
        try {
            //判断条件
            while (flag != 2) {
                c2.await();
            }
            //执行任务
            for (int i = 0; i < 2; i++) {
                System.out.println(String.format("线程:%s,第%s轮,第%s次打印", Thread.currentThread().getName(), loop, i + 1));
 
            }
            //修改标志位
            flag = 3;
            //通知
            c3.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //解锁
            lock.unlock();
        }
    }
 
    public void print3(int loop) {
        //加锁
        lock.lock();
        try {
            //判断条件
            while (flag != 3) {
                c3.await();
            }
            //执行任务
            for (int i = 0; i <3; i++) {
                System.out.println(String.format("线程:%s,第%s轮,第%s次打印", Thread.currentThread().getName(), loop, i + 1));
 
            }
            //修改标志位
            flag = 1;
            //通知
            c1.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //解锁
            lock.unlock();
        }
    }
}


2、创建线程,执行任务

 public static void main(String[] args) {
        Flag flag = new Flag();
        new Thread(() -> {
            for (int i = 0; i < 3; i++) {
                flag.print1(i + 1);
            }
        }, "t1").start();
        new Thread(() -> {
            for (int i = 0; i < 3; i++) {
                flag.print2(i + 1);
            }
        }, "t2").start();
        new Thread(() -> {
            for (int i = 0; i < 3; i++) {
                flag.print3(i + 1);
            }
        }, "t3").start();
    }

目录
相关文章
|
1天前
|
监控 Java 调度
Java并发编程:深入理解线程池
【6月更文挑战第26天】在Java并发编程的世界中,线程池是提升应用性能、优化资源管理的关键组件。本文将深入探讨线程池的内部机制,从核心概念到实际应用,揭示如何有效利用线程池来处理并发任务,同时避免常见的陷阱和错误实践。通过实例分析,我们将了解线程池配置的策略和对性能的影响,以及如何监控和维护线程池的健康状况。
7 1
|
1天前
|
存储 缓存 Java
老程序员分享:Java并发编程:线程池的使用
老程序员分享:Java并发编程:线程池的使用
|
1天前
|
Java 数据库连接 调度
Java多线程,对锁机制的进一步分析
Java多线程,对锁机制的进一步分析
|
1天前
|
安全 Java Python
线程间通信详解
线程间通信详解
|
1天前
|
Java
Java多线程notifyAll()方法
Java多线程notifyAll()方法
|
2天前
|
存储 设计模式 并行计算
CopyOnWriteArrayList:深入理解Java中的线程安全List原理和应用
CopyOnWriteArrayList:深入理解Java中的线程安全List原理和应用
|
2天前
|
存储 监控 Java
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
|
2天前
|
Java 测试技术 开发者
Java并发编程:深入理解线程池
本文将带领读者深入了解Java中的线程池,探索其内部机制、使用场景以及如何有效地利用线程池来提高程序的性能和可维护性。我们将通过实例演示如何创建和配置线程池,并讨论常见的并发模式和最佳实践。文章旨在为开发者提供实用的线程池应用知识,帮助他们在面对多线程编程挑战时,能够设计出更加高效和稳定的系统。
|
2天前
|
安全 Java 开发者
如何在Java中实现线程安全的单例模式
如何在Java中实现线程安全的单例模式
|
3天前
|
缓存 监控 安全
深入理解Java中的线程池和并发编程
深入理解Java中的线程池和并发编程

热门文章

最新文章