62,628
社区成员
发帖
与我相关
我的任务
分享public class ProConTest {
public static void main(String[] args) {
Resource res=new Resource();
Producer pro1=new Producer(res);
Producer pro2=new Producer(res);
Consumer con1=new Consumer(res);
Consumer con2=new Consumer(res);
pro1.start();
pro2.start();
con1.start();
con2.start();
}
}
class Resource {
private boolean flag=true;
private int count;
public synchronized void product() {
while(!flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"生产"+(++count)+"只烤鸭");
flag=false;
notifyAll();
}
public synchronized void consume() {
if(flag) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"消费"+(count)+"只烤鸭");
flag=true;
notifyAll();
}
}
class Producer extends Thread {
private Resource res;
public Producer(Resource res) {
super();
this.res = res;
}
public void run() {
while(true)
res.product();
}
}
class Consumer extends Thread{
private Resource res;
public Consumer(Resource res) {
super();
this.res = res;
}
public void run() {
while(true)
res.consume();
}
}public class ProConTest {
public static void main(String[] args) {
Resource res=new Resource();
Producer pro1=new Producer(res);
Producer pro2=new Producer(res);
Consumer con1=new Consumer(res);
Consumer con2=new Consumer(res);
pro1.start();
pro2.start();
con1.start();
con2.start();
}
}
class Resource {
private boolean flag=true;
private int count;
public synchronized void product() {
if(flag) {
System.out.println(Thread.currentThread().getName()+"生产"+(++count)+"只烤鸭");
flag=false;
}
}
public synchronized void consume() {
if(!flag) {
System.out.println(Thread.currentThread().getName()+"消费"+(count)+"只烤鸭");
flag=true;
}
}
}
class Producer extends Thread {
private Resource res;
public Producer(Resource res) {
super();
this.res = res;
}
public void run() {
while(true)
res.product();
}
}
class Consumer extends Thread{
private Resource res;
public Consumer(Resource res) {
super();
this.res = res;
}
public void run() {
while(true)
res.consume();
}
}
可以看出第二种形式简化了.从结果来看,好像也没什么不同,那是不是说,多生产者多消费者问题实际上可以不用等待唤醒机制来实现呢?
public class ProConTest {
public static void main(String[] args) {
Resource res=new Resource();
Producer pro=new Producer(res);
Consumer con=new Consumer(res);
Thread t1=new Thread(pro);
Thread t2=new Thread(con);
t1.start();
t2.start();
}
}
class Resource {
private String name;
private int count;
LinkedBlockingQueue queue=new LinkedBlockingQueue<>(1);
public synchronized void produce() {
count++;
try {
queue.put(count);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("生产"+count+"烤鸭");
}
public synchronized void consume() {
try {
System.out.println("消费"+queue.take()+"烤鸭");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Producer implements Runnable{
private Resource res;
public Producer(Resource res) {
super();
this.res = res;
}
@Override
public void run() {
while(true)
res.produce();
}
}
class Consumer implements Runnable{
private Resource res;
public Consumer(Resource res) {
super();
this.res = res;
}
@Override
public void run() {
while(true)
res.consume();
}
}