生產(chǎn)者和消費(fèi)者是操作系統(tǒng)中的一個(gè)經(jīng)典問題橡卤,這個(gè)問題是在講“進(jìn)程同步”時(shí)的一個(gè)例子顽铸,下面我就用Java語言中的notify和wait關(guān)鍵字實(shí)現(xiàn)這個(gè)算法雹食。
生產(chǎn)者
/**
* Description: 生產(chǎn)者.
*
* @author: crane-yuan
*/
public class Producer extends Thread
{
static final int MAXQUEUE = 10;
private Vector messages = new Vector();
/**
* Description:
*
* @see java.lang.Thread#run()
*/
@Override
public void run() {
try {
while (true) {
putMessage();
sleep(1500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private synchronized void putMessage() throws InterruptedException {
while (messages.size() == MAXQUEUE) {
wait();
}
messages.add(new Date().toLocaleString());
System.out.println("put message...");
notify();
}
//Called by Consumer
public synchronized String getMessage() throws InterruptedException {
notify();
while (messages.size() == 0) {
wait();
}
String message = (String) messages.firstElement();
messages.remove(message);
return message;
}
}
消費(fèi)者
/**
* Description: 消費(fèi)者.
*
* @author: crane-yuan
*/
public class Consumer extends Thread
{
Producer producer;
Consumer(Producer p) {
producer = p;
}
/**
* Description:
*
* @see java.lang.Thread#run()
*/
@Override
public void run() {
try {
while (true) {
String message = producer.getMessage();
System.out.println("Got message: "+message);
sleep(2000);
}
} catch(InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Producer producer = new Producer();
producer.start();
new Consumer(producer).start();
}
}
結(jié)果
put message...
Got message: 2016-11-5 17:06:28
put message...
Got message: 2016-11-5 17:06:30
put message...
Got message: 2016-11-5 17:06:32
put message...
put message...
Got message: 2016-11-5 17:06:33
put message...
Got message: 2016-11-5 17:06:35
put message...
Got message: 2016-11-5 17:06:36
put message...
put message...
Got message: 2016-11-5 17:06:38