//生产者-消费者模型
//多线程的典型例子
public class ProducerConsumer {
public static void main(String[] args)
{
Shared s = new Shared();
new Producer(s).start();
new Consumer(s).start();
}
}
class Shared
{
private char c;
private volatile boolean writeable = true;
synchronized void setSharedChar(char c)
{
while(!writeable)
{
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.c = c;
writeable = false; //写完之后写标志置为false
notify(); //写完之后将通知读操作
}
synchronized char getSharedChar()
{
while(writeable)
{
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
writeable = true;
notify();
return c;
}
}
//通过继承的方式创建线程
class Producer extends Thread
{
private final Shared s; //通过final关键字保证数据的原子性
Producer(Shared s)
{
this.s = s;
}
@Override
public void run()
{
for(char ch = 'A'; ch <= 'Z'; ch++)
{
synchronized(s) //保证setSharedChar()方法后伴随的System.out.println()同步
{
s.setSharedChar(ch);
System.out.println(ch + " produced by producer");
}
}
}
}
class Consumer extends Thread
{
private final Shared s; //通过final关键字保证数据的原子性
Consumer(Shared s)
{
this.s = s;
}
@Override
public void run()
{
char ch;
do
{
synchronized(s) //保证getSharedChar()方法后伴随的System.out.println()同步
{
ch = s.getSharedChar();
System.out.println(ch + " consumed by consumer.");
}
}
while(ch != 'Z');
}
}