java-多线程面试题:同时运行AB两个线程,交替输出1-10,A输出奇数B输出偶数
package com.cc.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 面试题:同时运行AB两个线程,交替输出1-10,即A输出奇数13579,B输出偶数246810, */ public class PrintLock { public static void main(String[] args) { ShareData2 shareData = new ShareData2(); new Thread(()->{//线程A循环5次 for (int i = 0; i < 5; i++) { shareData.printEvenData();//调用资源类打印奇数方法 } },"A").start(); new Thread(()->{//线程B循环5次 for (int i = 0; i < 5; i++) { shareData.printOddData();//调用资源类打印偶数方法 } },"B").start(); } } //资源类 class ShareData2{ private int data = 1; Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public void printEvenData(){ lock.lock(); try { while(data%2 != 0){//如果data不为偶数,则等待,为偶数则输出,设置data加1,并通知唤醒其他线程 condition.await(); } System.out.println(Thread.currentThread().getName() + "输出数:" + data++); condition.signalAll(); } catch (Exception e){ e.printStackTrace(); } finally { lock.unlock(); } } public void printOddData(){ lock.lock(); try { while(data %2 == 0){//如果data为偶数,则等待,为偶数则输出,设置data加1,并通知唤醒其他线程 condition.await(); } System.out.println(Thread.currentThread().getName() + "输出数:" + data++); condition.signalAll(); } catch (Exception e){ e.printStackTrace(); } finally { lock.unlock(); } } }