Utilize wait()/notify() em vez de yield().
public static void main( String[] args ){
Data data = new Data();
Lock
lock = new Lock();
final
Consumer consumer =
new Consumer( data, lock );
final
Producer producer =
new Producer( data, lock );
(new Thread( new Runnable() {
public void run() {
consumer.consume();
}
})).start();
(new Thread( new Runnable() {
public void run() {
producer.produce();
}
})).start();
}
public static final class Data {
public Data() {
super();
}
public int getValue() {
return
value;
}
public void setValue( int value ) {
this .value = value;
}
private int value = 0;
}
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( Data data,
Lock lock ) {
this .data = data;
this .lock = lock;
}
public void consume() {
System.out.println( "Consumidor: consume foi chamado" );
System.out.println(
"Consumidor: aguardando..." );
synchronized ( lock ) {
try {
lock.wait();
} catch (InterruptedException e) {}
}
System.out.println(
"Consumidor: o valor é " + data.getValue() );
System.out.println( "Consumidor: saindo" );
}
private Data data;
private Lock lock;
}
public static final class Producer {
public
Producer( Data data,
Lock lock ) {
this .data = data;
this .lock = lock;
}
public
void produce() {
System.out.println(
"Produtor: produce foi chamado" );
synchronized ( lock ) {
try
{ Thread.sleep( 3000 ); }
catch
(InterruptedException e) {}
data.setValue(
1
);System.out.println(
"Produtor: saindo" );
lock.unlock();
lock.notifyAll();
}
}
private Data data;
private Lock lock;
}
|
|