package juc ;
import java. util. concurrent. locks. Condition ;
import java. util. concurrent. locks. Lock ;
import java. util. concurrent. locks. ReentrantLock ;
public class PC {
public static void main ( String [ ] args) {
Resource resource = new Resource ( ) ;
new Thread ( ( ) -> {
for ( int i = 0 ; i < 10 ; i++ ) {
resource. printA ( ) ;
}
} , "A" ) . start ( ) ;
new Thread ( ( ) -> {
for ( int i = 0 ; i < 10 ; i++ ) {
resource. printB ( ) ;
}
} , "B" ) . start ( ) ;
new Thread ( ( ) -> {
for ( int i = 0 ; i < 10 ; i++ ) {
resource. printC ( ) ;
}
} , "C" ) . start ( ) ;
}
}
class Resource {
private int number = 1 ;
Lock lock = new ReentrantLock ( ) ;
private Condition condition1 = lock. newCondition ( ) ;
private Condition condition2 = lock. newCondition ( ) ;
private Condition condition3 = lock. newCondition ( ) ;
public void printA ( ) {
lock. lock ( ) ;
try {
while ( number != 1 ) {
condition1. await ( ) ;
}
number = 2 ;
System . out. println ( "当前线程的名字" + Thread . currentThread ( ) . getName ( ) ) ;
condition2. signal ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
} finally {
lock. unlock ( ) ;
}
}
public void printB ( ) {
lock. lock ( ) ;
try {
while ( number != 2 ) {
condition2. await ( ) ;
}
number = 3 ;
System . out. println ( "当前线程的名字" + Thread . currentThread ( ) . getName ( ) ) ;
condition3. signal ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
} finally {
lock. unlock ( ) ;
}
}
public void printC ( ) {
lock. lock ( ) ;
try {
while ( number != 3 ) {
condition3. await ( ) ;
}
number = 1 ;
System . out. println ( "当前线程的名字" + Thread . currentThread ( ) . getName ( ) ) ;
condition1. signal ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
} finally {
lock. unlock ( ) ;
}
}
}
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C