新手,在试着生产者消费者问题,刚开始的时候,SyncStack为空,但是会出现先执行c那个线程,打印出eat 0.然后才是produce: 0.jdk1.8的环境. 这个是为什么呀
public class ProducerConsumer{
public static void main(String[] args){
SyncStack ss = new SyncStack();
Producer p = new Producer(ss);
Consumer c = new Consumer(ss);
new Thread(p).start();
new Thread(c).start();
// tp.start();
// tc.start();
}
}
class WoTou{
int id;
WoTou(int id){
this.id = id;
}
public String toString(){
return "WoTou: "+id;
}
}
class SyncStack{
int index = 0;
WoTou[] arrWT = new WoTou[6];
public synchronized void push(WoTou wt){
if(index==arrWT.length){
try{
this.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
this.notify();
arrWT[index] = wt;
index++;
}
public synchronized WoTou pop(){
if(index == 0){
try{
this.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
this.notify();
index--;
return arrWT[index];
}
}
class Producer implements Runnable{
SyncStack ss = null;
Producer(SyncStack ss){
this.ss = ss;
}
public void run(){
for(int i = 0;i<20;i++){
WoTou wt = new WoTou(i);
ss.push(wt);
System.out.println("produce: "+wt);
try{
// Thread.sleep((int)(Math.random()*1000));
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
SyncStack ss = null;
Consumer(SyncStack ss){
this.ss = ss;
}
public void run(){
for(int i = 0;i<20;i++){
WoTou wt = ss.pop();
System.out.println("eat: "+wt);
try{
// Thread.sleep((int)(Math.random()*1000));
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
生产者消费者问题是研究多线程程序时绕不开的问题,它的描述是有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品,这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品而终止,也不能因缓冲区空消费者无产品可取而终止。
解决生......
答案就在这里:java中的生产者与消费者问题(多线程)
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。
再生产完就要打印,而不是等生产完通知消费进程后再打印
ss.push(wt);
System.out.println("produce: "+wt);
改
System.out.println("produce: "+wt);
ss.push(wt);
另外
this.notify();
arrWT[index] = wt;
index++;
notify应该放到最后
改
arrWT[index] = wt;
index++;
this.notify();//生产了再通知