管程法与信号灯法
管程法
public class TestPC {
public static void main ( String [ ] args) {
SynContainer container = new SynContainer ( ) ;
new Producer ( container) . start ( ) ;
new Consumer ( container) . start ( ) ;
}
}
class Producer extends Thread {
SynContainer container;
public Producer ( 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 Consumer extends Thread {
SynContainer container;
public Consumer ( 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 . notifyAll ( ) ;
}
public synchronized Chicken pop ( ) {
if ( count == 0 ) {
try {
this . wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
count-- ;
Chicken chicken = chickens[ count] ;
this . notifyAll ( ) ;
return chicken;
}
}
信号灯法
public class TestPC2 {
public static void main ( String [ ] args) {
TV tv= new TV ( ) ;
new Player ( tv) . start ( ) ;
new Watcher ( tv) . start ( ) ;
}
}
class Player extends Thread {
TV tv;
public Player ( TV tv) {
this . tv= tv;
}
@Override
public void run ( ) {
for ( int i = 0 ; i < 20 ; i++ ) {
if ( i% 2 == 0 ) {
this . tv. play ( "快乐大本营" ) ;
} else {
this . tv. play ( "记录美好生活" ) ;
}
}
}
}
class Watcher extends Thread {
TV tv;
public Watcher ( TV tv) {
this . tv = tv;
}
@Override
public void run ( ) {
for ( int i = 0 ; i < 20 ; i++ ) {
tv. watch ( ) ;
}
}
}
class TV{
String voice;
boolean flag = true ;
public synchronized void play ( String voice) {
if ( ! flag) {
try {
this . wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
System . out. println ( "演员表演了:" + voice) ;
this . notifyAll ( ) ;
this . voice = voice;
this . flag = ! this . flag;
}
public synchronized void watch ( ) {
if ( flag) {
try {
this . wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
System . out. println ( "观看了:" + voice) ;
this . notifyAll ( ) ;
this . flag = ! this . flag;
}
}