管程法
并发协作模型“生产者/消费者模式”
生产者:负责生产数据的模块(可能是方法、对象、线程、进程) 消费者:负责处理数据的模块(可能是方法、对象、线程、进程) 缓冲区:消费者不能直接使用生产者的数据,他们之间有缓冲区 (生产者将生产好的数据放入缓冲区,消费者从缓冲区拿出数据)
public class TestPC {
public static void main ( String[ ] args) {
SynContainer container = new SynContainer ( ) ;
new Productor ( container) . start ( ) ;
new Coustomer ( container) . start ( ) ;
}
}
class Productor extends Thread {
SynContainer container;
public Productor ( SynContainer container) {
this . container = container;
}
@Override
public void run ( ) {
for ( int i = 0 ; i < 100 ; i++ ) {
container. push ( new Chicken ( i) ) ;
System. out. println ( "生产了" + i+ "只鸡" ) ;
}
}
}
class Coustomer extends Thread {
SynContainer container;
public Coustomer ( SynContainer container) {
this . container = container;
}
@Override
public void run ( ) {
for ( int i = 0 ; i < 100 ; i++ ) {
System. out. println ( "消费了" + container. pop ( ) . id+ "只鸡" ) ;
}
}
}
class Chicken {
int id;
public Chicken ( int id) {
this . id = id;
}
}
class SynContainer {
Chicken[ ] chickens = new Chicken [ 10 ] ;
int count = 0 ;
public synchronized void push ( Chicken chicken) {
if ( count== chickens. length) {
try {
this . wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
chickens[ count] = chicken;
count++ ;
this . notify ( ) ;
}
public synchronized Chicken pop ( ) {
if ( count== 0 ) {
try {
this . wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
count-- ;
Chicken chicken = chickens[ count] ;
this . notify ( ) ;
return chicken;
}
}