public static void main( String[] args ){
Lock
lock = new Lock();
final
Consumer consumer1 =
new Consumer( lock,
1 );
final
Consumer consumer2 =
new Consumer( lock,
2 );
final
Producer producer =
new Producer( lock );
(new
Thread( new Runnable() {
public void run() {
consumer1.consume();
}
})).start();
(new
Thread( new Runnable() {
public void run() {
consumer2.consume();
}
})).start();
(new
Thread( new Runnable() {
public void run() {
producer.produce();
}
})).start();
}
public
static
final
class Lock {
public
Lock() {
super();
lock();
}
public
boolean isAvailable() {
return
available;
}
public
void lock() {
available
= false;
}
public
void unlock() {
available
= true;
}
private
boolean available =
false;
}
public
static
final
class Consumer {
public
Consumer( Lock lock,
int id ) {
this
.lock = lock;
this
.id = id;
}
public
void consume() {
System.out.println(
"Consumidor " + id +
": consume foi chamado" );
if
( !lock.isAvailable() ) {
System.out.println(
"Consumidor" + id +
": aguardando..." );
synchronized ( lock ) {
try {
lock.wait();
}
catch
(InterruptedException e) {}
}
}
System.out.println(
"Consumidor" + id +
": saindo" );
}
private
Lock lock;
private
int id;
}
public
static
final
class Producer {
public
Producer( Lock lock ) {
this
.lock = lock;
}
public
void produce() {
System.out.println(
"Produtor: produce foi chamado" );
synchronized ( lock ) {
lock.notifyAll();
}
synchronized ( lock ) {
System.out.println(
"Produtor: desbloqueando..." );
lock.unlock();
lock.notifyAll();
}
System.out.println(
"Produtor: saindo" );
}
private
Lock lock;
}
|
|