Drop category :
package Threads;
public class Drop {
/ / Message sent from producer to consumer.
private String message;
/ / True if consumer should wait for producer to send message
/ / false if producer should wait for consumer
/ / to retrieve message.
private boolean empty = true;
public synchronized String take () {
/ / Wait until message is available.
while (empty) {
try {
wait ();
} catch (InterruptedException e) {
}
}
/ / Toggle status.
empty = true;
/ / Notify producer that status has changed.
notifyAll ();
return message;
}
public synchronized void put (String message) {
/ / wait until message has been retrieved.
while (! empty) {
try {
wait ();
} catch (InterruptedException e) {
}
/ / Toggle staus.
empty = false;
/ / store message.
this.message = message;
/ / Notify consumer that status has changed.
notifyAll ();
}
}
}
Producer category :
package Threads;
import java.util.Random;
public class Producer implements Runnable {
private Drop drop;
public Producer (Drop drop) {
this.drop = drop;
}
public void run () {
String importantInfo [] = {
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too"
};
Random random = new Random ();
for (int i = 0; i
try {
Thread.sleep (random.nextInt (5000));
} catch (InterruptedException e) {
}
}
drop.put ("DONE");
}
}
Consumer category :
package Threads;
import java.util.Random;
public class Consumer implements Runnable {
private Drop drop;
public Consumer (Drop drop) {
this.drop = drop;
}
@ Override
public void run () {
/ / TODO Auto-generated method stub
Random random = new Random ();
for (String message = drop.take ();! message.equals ("DONE"); message = drop.take ()) {
System.out.format ("MESSAGE RECEIVED:% s% n", message);
try {
Thread.sleep (random.nextInt (5000));
} catch (InterruptedException exception) {
}
}
}
}
ProducerConsumerExample main thread class :
package Threads;
public class ProducerConsumerExample {
public static void main (String [] args) {
/ / TODO Auto-generated method stub
Drop drop = new Drop ();
(new Thread (new Producer (drop))) start ().;
(new Thread (new Consumer (drop))) start ().;
}
}
------ Solution ----------------------------------- ---------
brackets wrong
public synchronized void put (String message) {
/ / wait until message has been retrieved.
while (! empty) {
try {
wait ();
} catch (InterruptedException e) {
}
} / / *** this bracket you go below
/ / Toggle staus.
empty = false;
/ / store message.
this.message = message;
/ / Notify consumer that status has changed.
notifyAll ();
}
------ For reference only --------------------------------- ------
each time the result is not it?
------ For reference only ---------------------------------- -----
Yes, blank, in every case
------ For reference only -------------------- -------------------
this code can not see , the code is written very clean , reading too tired , just say you write a function to multi-threaded won.
------ For reference only -------------------------------------- -
public synchronized void put(String message) {
// wait until message has been retrieved.
while (!empty) {
try {
wait();
} catch (InterruptedException e) {
}
}
// Toggle staus.
empty = false;
// store message.
this.message = message;
// Notify consumer that status has changed.
notifyAll();
} ------ For reference only ------------------------------- --------
Indeed, the analysis is still not clear , thank you , bear stickers !
没有评论:
发表评论