题目

三个线程循环打印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();
            }
        }
    };

}