三个线程交替打印ABC:
package pc;
import java. util. concurrent. locks. Condition;
import java. util. concurrent. locks. Lock;
import java. util. concurrent. locks. ReentrantLock;
public class C {
public static void main ( String[ ] args) {
Data3 data3 = new Data3 ( ) ;
new Thread ( ( ) - > {
for ( int i = 0 ; i < 50 ; i++ ) {
data3. PrintA ( ) ;
}
} ) . start ( ) ;
new Thread ( ( ) - > {
for ( int i = 0 ; i < 50 ; i++ ) {
data3. PrintB ( ) ;
}
} ) . start ( ) ;
new Thread ( ( ) - > {
for ( int i = 0 ; i < 50 ; i++ ) {
data3. PrintC ( ) ;
}
} ) . start ( ) ;
}
}
class Data3 {
private char chars = 'A' ;
Lock lock = new ReentrantLock ( ) ;
Condition condition1 = lock. newCondition ( ) ;
Condition condition2 = lock. newCondition ( ) ;
Condition condition3 = lock. newCondition ( ) ;
public void PrintA ( ) {
lock. lock ( ) ;
try {
while ( chars != 'A' ) {
condition1. await ( ) ;
}
System. out. print ( chars) ;
chars = 'B' ;
condition2. signal ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
} finally {
lock. unlock ( ) ;
}
}
public void PrintB ( ) {
lock. lock ( ) ;
try {
while ( chars != 'B' ) {
condition2. await ( ) ;
}
System. out. print ( chars) ;
chars = 'C' ;
condition3. signal ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
} finally {
lock. unlock ( ) ;
}
}
public void PrintC ( ) {
lock. lock ( ) ;
try {
while ( chars != 'C' ) {
condition3. await ( ) ;
}
System. out. print ( chars) ;
chars = 'A' ;
condition1. signal ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
} finally {
lock. unlock ( ) ;
}
}
}
生产者和消费者问题:
(synchronize + wait + notifyAll)
class Data {
private int number = 0 ;
public synchronized void increment ( ) throws InterruptedException {
while ( number != 0 ) {
this . wait ( ) ;
}
number++ ;
System. out. println ( Thread. currentThread ( ) . getName ( ) + "=>" + number) ;
this . notifyAll ( ) ;
}
public synchronized void decrement ( ) throws InterruptedException {
while ( number == 0 ) {
this . wait ( ) ;
}
number-- ;
System. out. println ( Thread. currentThread ( ) . getName ( ) + "=>" + number) ;
this . notifyAll ( ) ;
}
}
(ReentrantLock+Condition)
package pc;
import java. util. concurrent. locks. Condition;
import java. util. concurrent. locks. Lock;
import java. util. concurrent. locks. ReentrantLock;
public class B {
public static void main ( String[ ] args) {
Data2 data = new Data2 ( ) ;
new Thread ( ( ) - > {
for ( int i = 0 ; i < 10 ; i++ ) {
try {
data. increment ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
} , "A" ) . start ( ) ;
new Thread ( ( ) - > {
for ( int i = 0 ; i < 10 ; i++ ) {
try {
data. decrement ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
} , "B" ) . start ( ) ;
}
}
class Data2 {
private int number = 0 ;
Lock lock = new ReentrantLock ( ) ;
Condition condition = lock. newCondition ( ) ;
public void increment ( ) throws InterruptedException {
lock. lock ( ) ;
try {
while ( number != 0 ) {
condition. await ( ) ;
}
number++ ;
System. out. println ( Thread. currentThread ( ) . getName ( ) + "=>" + number) ;
condition. signalAll ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
} finally {
lock. unlock ( ) ;
}
}
public void decrement ( ) throws InterruptedException {
lock. lock ( ) ;
try {
while ( number == 0 ) {
condition. await ( ) ;
}
number-- ;
System. out. println ( Thread. currentThread ( ) . getName ( ) + "=>" + number) ;
condition. signalAll ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
} finally {
lock. unlock ( ) ;
}
}
}