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

Posted 慕枫技术笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
            }
        }
    };

}

以上是关于LeetCode解题之十七:循环打印ABC的主要内容,如果未能解决你的问题,请参考以下文章

BetaFlight模块设计之十七:pinioBox任务分析

Android基础之十七使用网络技术

PX4模块设计之十七:ModuleBase模块

Qt优秀开源项目之十七:QtPromise

Java经典编程题50道之十七

推荐系统系列教程之十七:简单却有效的Bandit算法