LeetCode解题之十七:循环打印ABC

简介: LeetCode解题之十七:循环打印ABC

题目

三个线程循环打印A、B、C。

分析

主要考察线程之间的协同作业,涉及线程通信。

代码

package com.mf.module.leetcode;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
 * @Auther: mufeng
 * @Date: 2020/8/15 20:41
 * @Version: V 1.0.0
 * @Description: Three threads print
 */
public class NThreadPrint {
    private static ReentrantLock lock = new ReentrantLock();
    private static Condition condition1 = lock.newCondition();
    private static Condition condition2 = lock.newCondition();
    private static Condition condition3 = lock.newCondition();
    private static int count = 0;
    public static void main(String[] args) {
        Thread t1 = new Thread(thread1);
        Thread t2 = new Thread(thread2);
        Thread t3 = new Thread(thread3);
        t1.start();
        t2.start();
        t3.start();
    }
    private static Runnable thread1 = () -> {
        for (int i = 0 ; i < 3 ; i ++){
            try {
                lock.lock();
                if (count % 3 != 0) {
                    condition1.await();
                }
                System.out.println("A");
                count++;
                condition2.signal();
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    };
    private static Runnable thread2 = () -> {
        for (int i = 0 ; i < 3 ; i ++){
            try {
                lock.lock();
                if (count % 3 != 1) {
                    condition2.await();
                }
                System.out.println("B");
                count++;
                condition3.signal();
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    };
    private static Runnable thread3 = () -> {
        for (int i = 0 ; i < 3 ; i ++){
            try {
                lock.lock();
                if (count % 3 != 2) {
                    condition3.await();
                }
                System.out.println("C");
                count++;
                condition1.signal();
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    };
}
相关文章
|
6月前
|
存储 算法
LeetCode刷题---75. 颜色分类(双指针,循环不变量)
LeetCode刷题---75. 颜色分类(双指针,循环不变量)
|
机器学习/深度学习 JavaScript 前端开发
LeetCode 51.N皇后(JavaScript 解题)
LeetCode 51.N皇后(JavaScript 解题)
59 0
|
29天前
|
人工智能 自然语言处理 程序员
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
欢迎来到工程师令狐小哥的频道。本文介绍如何利用AI工具高效刷LeetCode,通过通义灵码插件在IntelliJ IDEA中实现代码生成、优化、单元测试等功能,提升编程学习效率。
60 1
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
|
3月前
|
Python
【Leetcode刷题Python】641.循环双端队列
文章介绍了如何实现一个循环双端队列,包括其操作如插入、删除、获取队首和队尾元素,以及检查队列是否为空或已满,并提供了Python语言的实现代码。
22 0
【力扣-TS解题】1、回文数
【力扣-TS解题】1、回文数
50 0
|
JavaScript 前端开发 算法
LeetCode 37.解数独(注释完整+JavaScript解题)
LeetCode 37.解数独(注释完整+JavaScript解题)
78 0
|
算法
LeetCode 37 解数独 循环+回溯算法
LeetCode 37 解数独 循环+回溯算法
57 0
|
算法 测试技术 程序员
如何提高力扣(Leetcode)的解题能力?
如何提高力扣(Leetcode)的解题能力?
|
SQL 数据库
力扣SQL之路:解题分析与实战技巧
力扣SQL之路:解题分析与实战技巧
200 0
leetcode 315周赛 解题报告
leetcode 315周赛 解题报告
65 0