java-多线程面试题:同时运行ABC三个线程,依次输出ABC,最终结果为ABCABCABCABC
package com.cc.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 面试题:同时运行ABC三个线程,依次输出ABC,最终结果为ABCABCABCABC... */ public class PrintLock3 { public static void main(String[] args) { ShareData3 shareData = new ShareData3(); new Thread(() -> {//线程A循环5次 for (int i = 0; i < 5; i++) { shareData.printA();//调用资源类打印A方法 } }, "A").start(); new Thread(() -> {//线程B循环5次 for (int i = 0; i < 5; i++) { shareData.printB();//调用资源类打印B方法 } }, "B").start(); new Thread(() -> {//线程C循环5次 for (int i = 0; i < 5; i++) { shareData.printC();//调用资源类打印C方法 } }, "C").start(); } } //资源类 class ShareData3{ private int flag = 1; Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public void printA(){ lock.lock(); try { while(flag != 1){//如果flag不为1,则等待,为偶数则输出,然后设置flag为2并通知唤醒其他线程 condition.await(); } System.out.println(Thread.currentThread().getName() + "输出数:A"); flag = 2; condition.signalAll(); } catch (Exception e){ e.printStackTrace(); } finally { lock.unlock(); } } public void printB(){ lock.lock(); try { while(flag != 2){//如果flag不为2,则等待,为偶数则输出,然后设置flag为3并通知唤醒其他线程 condition.await(); } System.out.println(Thread.currentThread().getName() + "输出数:B"); flag = 3; condition.signalAll(); } catch (Exception e){ e.printStackTrace(); } finally { lock.unlock(); } } public void printC(){ lock.lock(); try { while(flag != 3){//如果flag不为3,则等待,为偶数则输出,然后设置flag为1并通知唤醒其他线程 condition.await(); } System.out.println(Thread.currentThread().getName() + "输出数:C"); flag = 1; condition.signalAll(); } catch (Exception e){ e.printStackTrace(); } finally { lock.unlock(); } } }