第一种方式:使用wait/notify实现
public class PrintABC1 { int state;//状态量,指示线程交替 int times;//每个线程打印次数 private static final Object lock=new Object(); public void printABC1(int times){ this.times=times; } public void print(String str,int target){ for(int i=0;i<times;i++){ synchronized (PrintABC1.class){ if (state % 3 == target){ state++; try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } notifyAll(); } } } public static void main(String[] args){ printABC printABC=new printABC(3); Thread t1=new Thread(()->{ printABC.print("A",0); }); Thread t2=new Thread(()->{ printABC.print("B",1); }); Thread t3=new Thread(()->{ printABC.print("C",2); }); t1.start(); t2.start(); t3.start(); } }
第二种方式:使用ReentrantLock实现
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class printABC { private int times; private int state; Lock lock=new ReentrantLock(); public printABC(int times){ this.times=times; } public void print(String str,int target){ for(int i=0;i<times;){ if (state % 3 == target){ lock.lock(); System.out.println(str); state++; i++;//重点,i++如果写在for循环中就会导致当if条件不满足时直接进入下一次循环,无法实现交替功能 //写在被锁住的代码块之间使得只有在满足if条件时,才有i++ lock.unlock(); } } } public static void main(String[] args){ printABC printABC=new printABC(3); Thread t1=new Thread(()->{ printABC.print("A",0); }); Thread t2=new Thread(()->{ printABC.print("B",1); }); Thread t3=new Thread(()->{ printABC.print("C",2); }); t1.start(); t2.start(); t3.start(); } }
原文:https://www.cnblogs.com/lcy6/p/14978902.html