标签:多线程
public class PandC {
public static void main(String[] args) {
// Producer p= new Producer();
// Consumer c = new Consumer();
// new Thread(p,"生产者").start();
// new Thread(p,"生产者").start();
// new Thread(c,"消费者").start();
// new Thread(c,"消费者").start();
new Thread(new Producer(),"生产者").start();
new Thread(new Consumer(),"消费者").start();
new Thread(new Producer(),"生产者").start();
new Thread(new Consumer(),"消费者").start();
}
}
//通过单例模式 保证资源唯一
class Resource{
private String name;
private int count;
private boolean flag=false;
static Resource r = new Resource();
private Resource() {
}
public static Resource getRes(){
return r;
}
public synchronized void produce(String name){
if(!flag)
try {
wait();//this.wait(); //this可省略
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
name = name+count++;
flag=false;
System.out.println(Thread.currentThread().getName()+" .........生产商品:"+count);
this.notify();//this可省略
}
public synchronized void consume(){
if(flag)
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
flag=true;
System.out.println(Thread.currentThread().getName()+" ======消费商品:"+count);
notify();
}
}
class Producer implements Runnable{
Resource r = Resource.getRes();
@Override
public void run() {
while(true)
r.produce("商品:");
}
}
class Consumer implements Runnable{
Resource r = Resource.getRes();
@Override
public void run() {
while(true)
r.consume();
}
}输出:
/*
输出: 生产一个 被消费两次
生产者 .........生产商品:44500
消费者 ======消费商品:44500
消费者 ======消费商品:44500
生产者 .........生产商品:44501
消费者 ======消费商品:44501
消费者 ======消费商品:44501
生产两个 却只被消费一个
生产者 .........生产商品:45841
生产者 .........生产商品:45842
消费者 ======消费商品:45842
生产者 .........生产商品:45843
消费者 ======消费商品:45843
本文出自 “要么拼命,要么滚回去!” 博客,请务必保留此出处http://jiangzuun2014.blog.51cto.com/8732469/1441233
标签:多线程
原文地址:http://jiangzuun2014.blog.51cto.com/8732469/1441233