java线程生产者消费者问题
package threadlearning;
高手指教一下啊
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();
}
}
class WoTou
{
private int id;
public WoTou(int id)
{
this.id = id;
}
public String toString()
{
return "wotou的数量 : "+id;
}
}
class Producer implements Runnable
{
SyncStack ss = null;
Producer(SyncStack ss)
{
this.ss = ss;
}
public void run()
{
for(int i=0; i<10; i++)
{
WoTou wt = new WoTou(i);
ss.push(wt);
System.out.println("生产了:" + wt);
// try {
// Thread.sleep(5000);
// } 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<10; i++)
{
WoTou wt = ss.pop();
System.out.println("消费了: " + wt);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class SyncStack
{
WoTou [] arrWt = new WoTou[6];
int index = 0;
public synchronized void push(WoTou wt)
{
while(index >= 6)
{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
arrWt[index]= wt;
index++;
}
public synchronized WoTou pop()
{
while(index==0)
{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
index--;
return arrWt[index];
}
}
输出结果
消费了: wotou的数量 : 0
生产了:wotou的数量 : 0
生产了:wotou的数量 : 1
生产了:wotou的数量 : 2
生产了:wotou的数量 : 3
生产了:wotou的数量 : 4
生产了:wotou的数量 : 5
生产了:wotou的数量 : 6
生产了:wotou的数量 : 7--------------怎么会超出容量呢?????????????
消费了: wotou的数量 : 6
生产了:wotou的数量 : 8
消费了: wotou的数量 : 7
消费了: wotou的数量 : 8
生产了:wotou的数量 : 9
消费了: wotou的数量 : 9
消费了: wotou的数量 : 5
消费了: wotou的数量 : 4
消费了: wotou的数量 : 3
消费了: wotou的数量 : 2
消费了: wotou的数量 : 1
------解决方案--------------------SyncStack这个的容量并没有超出
for(int i=0; i <10; i++)
{
WoTou wt = new WoTou(i);
ss.push(wt);
System.out.println("生产了:" + wt);
楼主new 10个WoTou,new一个就push一个,等到SyncStack满了,就wait(),此时程序并没有停止,等到SyncStack不满的时候,还会继续new WoTou,直到for循环结束!!
------解决方案--------------------Java code
public synchronized void push(WoTou wt)
{
while(index >= 6)
{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
arrWt[index]= wt;
index++;
}
public synchronized WoTou pop()
{
while(index==0)
{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
index--;
return arrWt[index];
}
}
------解决方案--------------------