生产者消费者
import java. util. concurrent. locks. Condition;
import java. util. concurrent. locks. ReentrantLock;
import static java. lang. Thread. sleep;
public class Main {
class Depository {
int macNum;
public Depository ( int macNum) {
this . macNum = macNum;
}
}
ReentrantLock lock = new ReentrantLock ( ) ;
Condition full = lock. newCondition ( ) ;
Condition empty = lock. newCondition ( ) ;
Depository depository = new Depository ( 0 ) ;
public static void main ( String[ ] args) {
Main main = new Main ( ) ;
Thread producer = new Thread ( main. new Producer ( ) , "producer" ) ;
Thread producer1 = new Thread ( main. new Producer ( ) , "producer1" ) ;
Thread producer2 = new Thread ( main. new Producer ( ) , "producer2" ) ;
Thread producer3 = new Thread ( main. new Producer ( ) , "producer3" ) ;
Thread consumer = new Thread ( main. new Consumer ( ) , "consumer" ) ;
Thread consumer1 = new Thread ( main. new Consumer ( ) , "consumer1" ) ;
Thread consumer2 = new Thread ( main. new Consumer ( ) , "consumer2" ) ;
Thread consumer3 = new Thread ( main. new Consumer ( ) , "consumer3" ) ;
producer. start ( ) ;
consumer. start ( ) ;
producer1. start ( ) ;
consumer1. start ( ) ;
producer2. start ( ) ;
consumer2. start ( ) ;
producer3. start ( ) ;
consumer3. start ( ) ;
}
class Producer implements Runnable {
@Override
public void run ( ) {
while ( true ) {
try {
try {
sleep ( 3000 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
lock. lock ( ) ;
while ( depository. macNum == 15 ) {
try {
System. out. println ( Thread. currentThread ( ) + "生产太多仓库堆满!等待消费~" ) ;
full. await ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
depository. macNum++ ;
System. out. println ( Thread. currentThread ( ) + "生产了一台mac,目前一共" + depository. macNum) ;
empty. signal ( ) ;
} finally {
lock. unlock ( ) ;
}
}
}
}
class Consumer implements Runnable {
@Override
public void run ( ) {
while ( true ) {
try {
try {
sleep ( 3000 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
lock. lock ( ) ;
while ( depository. macNum == 0 ) {
try {
System. out. println ( Thread. currentThread ( ) + "仓库没货了!等待生产~" ) ;
empty. await ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
depository. macNum-- ;
System. out. println ( Thread. currentThread ( ) + "消费了一台mac,目前一共" + depository. macNum) ;
full. signal ( ) ;
} finally {
lock. unlock ( ) ;
}
}
}
}
}