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