public class ConditionTest {
private final Lock lock = new ReentrantLock();
private final Condition conditionA = lock.newCondition();
private final Condition conditionB = lock.newCondition();// 控制状态
private int flag =1;
public staticvoidmain(String[] args){
ConditionTest conditionTest = new ConditionTest();
Thread tA = new Thread(()->{for(int i =1; i <=10; i++){
conditionTest.printA(i);}},"A");
tA.start();
Thread tB = new Thread(()->{for(int i =1; i <=10; i++){
conditionTest.printB(i);}},"B");
tB.start();}
public voidprintA(int i){
lock.lock();
try {if(flag !=1){
conditionA.await();}}catch(Exception e){}
flag =2;
conditionB.signal();
System.out.println(Thread.currentThread().getName()+"---print---"+ i);
lock.unlock();}
public voidprintB(int i){
lock.lock();
try {if(flag !=2){
conditionB.await();}
flag =1;
conditionA.signal();}catch(Exception exception){}
System.out.println(Thread.currentThread().getName()+"---print---"+ i);
lock.unlock();}}
condition 2
public class ConditionTest {
public final static Lock lock = new ReentrantLock();
public final static Condition conditionA = lock.newCondition();
public final static Condition conditionB = lock.newCondition();
private int flag =1;
public staticvoidmain(String[] args){
ConditionTest conditionTest = new ConditionTest();
new Thread(()->{
conditionTest.printABC(0, conditionA, conditionB);},"A").start();
new Thread(()->{
conditionTest.printABC(1, conditionB, conditionA);},"B").start();}
private voidprintABC(int targetNum, Condition currentThread, Condition nextThread){for(int i =0; i <3;){
lock.lock();
try {while(flag %2!= targetNum){
currentThread.await();//阻塞当前线程}
flag++;// 调整线程信号量数据(阻塞和唤起)
i++;// 当前线程内的循环数据累加
System.out.print(Thread.currentThread().getName());
nextThread.signal();//唤醒下一个线程}catch(Exception e){
e.printStackTrace();} finally {
lock.unlock();}}}}
Lock
public class ConditionTest1 {
private static final Lock lock = new ReentrantLock();//通过JDK5中的Lock锁来保证线程的访问的互斥
private staticint num =1;
public staticvoidmain(String[] args){
ConditionTest1 conditionTest1 = new ConditionTest1();
Thread tA = new Thread(()->{
conditionTest1.printStr(0);},"A");
tA.start();
Thread tB = new Thread(()->{
conditionTest1.printStr(1);},"B");
tB.start();
Thread tc = new Thread(()->{
conditionTest1.printStr(2);},"C");
tc.start();}
public voidprintStr(int targetNum){for(int i =0; i <3;){
lock.lock();if(num %3== targetNum){
num++;
i++;
System.out.println(Thread.currentThread().getName());}
lock.unlock();}}}