public class ProducerCustumerDemo {
/**
* @param args
*/
public static void main(String[] args) {
//着这里传建一个资源类,是为了多线程之间保持操作的是一个资源,用构造函数等的方式传递到线程类中
Resouce resouce=new Resouce();
//创建多个生产和消费的线程类
Producer producer1=new Producer(resouce);
Producer producer2=new Producer(resouce);
Custumer custumer1=new Custumer(resouce);
Custumer custumer2=new Custumer(resouce);
new Thread(producer1).start();
new Thread(producer2).start();
new Thread(custumer1).start();
new Thread(custumer2).start();
}
//定义一个线程共享的一个资源类
static class Resouce{
//商品的ID
private int id;
//商品的名字
private String name;
//用于判断是否生产或者消费的数据,
private boolean flag=false;
//同步方法,是为了线程之间保持数据的一致性,不会出现意外的情况发生
public synchronized void set(String name)
{
//这里用while循环是为了防止多个线程,重复生产的情况
while(flag)
try {
this.wait();//线程等待,也即是放弃运行的资格
} catch (Exception e) {
// TODO: handle exception
}
this.name=name+id++;
//获取当前线程的名称
String currentThread=Thread.currentThread().getName();
System.out.println(currentThread+"生产"+this.name+"....");
//消费之后,让消费的线程继续消费该商品
this.flag=true;
this.notifyAll();
}
public synchronized void out()
{
//这里用while循环是为了防止多个线程,多消费情况
while(!flag)
try {
this.wait();//线程等待,也即是放弃运行的资格
} catch (Exception e) {
// TODO: handle exception
}
//获取当前线程的名称
String currentThread=Thread.currentThread().getName();
System.out.println(".........."+currentThread+"消费了"+this.name);
//消费之后,让生产的线程继续生产产品
this.flag=false;
//唤醒线程池中的线程,这里不用notiy()是因为这里可能出现死锁的现象
this.notifyAll();
}
}
//生产商品的线程类
static class Producer implements Runnable{
//顶一个资源类对象
Resouce resouce=null;
public Producer(Resouce re) {
this.resouce=re;
}
@Override
public void run() {
for(int i=0;i<100;i++)
resouce.set("小米电视");
}
}
//消费商品的线程类
static class Custumer implements Runnable{
Resouce resouce=null;
public Custumer(Resouce re) {
this.resouce=re;
}
public void run() {
for(int i=0;i<100;i++)
resouce.out();
}
}
}