新手,在试着生产者消费者问题,刚开始的时候,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();
}
}
}
}