//以下是源码
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/package pc;/**
*
* @author seven
*/
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 { //产品类
int id;
WoTou(int id) {
this.id = id;
}
public String toString() {
return " : " + id;
}
}class SyncStack { //栈,用来当容器
int index = 0;
WoTou[] arrWT = new WoTou[5];
public synchronized void push(WoTou wt) { //产品入栈(生产)
while(index == arrWT.length) {
try {
System.out.println("正在等待消费");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
arrWT[index] = wt;
index ++;
}
public synchronized WoTou pop() { //产品出栈(消费)
while(index == 0) {
try {
System.out.println("正在等待生产");
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<30; i++) {
WoTou wt = new WoTou(i);
ss.push(wt);
System.out.println("生产了" + wt + "号产品");
try {
Thread.sleep(500);
} 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<30; i++) {
WoTou wt = ss.pop();
System.out.println("消费了" + wt + "号产品");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//以下是运行结果生产了 : 0号产品
消费了 : 0号产品
生产了 : 1号产品
生产了 : 2号产品
消费了 : 2号产品
生产了 : 3号产品
生产了 : 4号产品
消费了 : 4号产品
生产了 : 5号产品
生产了 : 6号产品
消费了 : 6号产品
生产了 : 7号产品
生产了 : 8号产品
消费了 : 8号产品
生产了 : 9号产品
正在等待消费
生产了 : 10号产品
消费了 : 9号产品
正在等待消费
生产了 : 11号产品
消费了 : 10号产品
正在等待消费
生产了 : 12号产品
消费了 : 11号产品
正在等待消费
生产了 : 13号产品
消费了 : 12号产品
正在等待消费
生产了 : 14号产品
消费了 : 13号产品
正在等待消费
生产了 : 15号产品
消费了 : 14号产品
正在等待消费
生产了 : 16号产品
消费了 : 15号产品
正在等待消费
生产了 : 17号产品
消费了 : 16号产品
正在等待消费
生产了 : 18号产品
消费了 : 17号产品
正在等待消费
生产了 : 19号产品
消费了 : 18号产品
正在等待消费
生产了 : 20号产品
消费了 : 19号产品
正在等待消费
生产了 : 21号产品
消费了 : 20号产品
正在等待消费
生产了 : 22号产品
消费了 : 21号产品
正在等待消费
生产了 : 23号产品
消费了 : 22号产品
正在等待消费
生产了 : 24号产品
消费了 : 23号产品
正在等待消费
生产了 : 25号产品
消费了 : 24号产品
正在等待消费
生产了 : 26号产品
消费了 : 25号产品
正在等待消费
生产了 : 27号产品
消费了 : 26号产品
正在等待消费
生产了 : 28号产品
消费了 : 27号产品
正在等待消费
生产了 : 29号产品
消费了 : 28号产品
消费了 : 29号产品
消费了 : 7号产品
消费了 : 5号产品
消费了 : 3号产品
消费了 : 1号产品
这是我写的一个生产者与消费者的程序,缓冲区满的时候,等待消费,理应先进行消费,为什么先执行的生产呢?程序的问题出在哪里呢?
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/package pc;/**
*
* @author seven
*/
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 { //产品类
int id;
WoTou(int id) {
this.id = id;
}
public String toString() {
return " : " + id;
}
}class SyncStack { //栈,用来当容器
int index = 0;
WoTou[] arrWT = new WoTou[5];
public synchronized void push(WoTou wt) { //产品入栈(生产)
while(index == arrWT.length) {
try {
System.out.println("正在等待消费");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
arrWT[index] = wt;
index ++;
}
public synchronized WoTou pop() { //产品出栈(消费)
while(index == 0) {
try {
System.out.println("正在等待生产");
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<30; i++) {
WoTou wt = new WoTou(i);
ss.push(wt);
System.out.println("生产了" + wt + "号产品");
try {
Thread.sleep(500);
} 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<30; i++) {
WoTou wt = ss.pop();
System.out.println("消费了" + wt + "号产品");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//以下是运行结果生产了 : 0号产品
消费了 : 0号产品
生产了 : 1号产品
生产了 : 2号产品
消费了 : 2号产品
生产了 : 3号产品
生产了 : 4号产品
消费了 : 4号产品
生产了 : 5号产品
生产了 : 6号产品
消费了 : 6号产品
生产了 : 7号产品
生产了 : 8号产品
消费了 : 8号产品
生产了 : 9号产品
正在等待消费
生产了 : 10号产品
消费了 : 9号产品
正在等待消费
生产了 : 11号产品
消费了 : 10号产品
正在等待消费
生产了 : 12号产品
消费了 : 11号产品
正在等待消费
生产了 : 13号产品
消费了 : 12号产品
正在等待消费
生产了 : 14号产品
消费了 : 13号产品
正在等待消费
生产了 : 15号产品
消费了 : 14号产品
正在等待消费
生产了 : 16号产品
消费了 : 15号产品
正在等待消费
生产了 : 17号产品
消费了 : 16号产品
正在等待消费
生产了 : 18号产品
消费了 : 17号产品
正在等待消费
生产了 : 19号产品
消费了 : 18号产品
正在等待消费
生产了 : 20号产品
消费了 : 19号产品
正在等待消费
生产了 : 21号产品
消费了 : 20号产品
正在等待消费
生产了 : 22号产品
消费了 : 21号产品
正在等待消费
生产了 : 23号产品
消费了 : 22号产品
正在等待消费
生产了 : 24号产品
消费了 : 23号产品
正在等待消费
生产了 : 25号产品
消费了 : 24号产品
正在等待消费
生产了 : 26号产品
消费了 : 25号产品
正在等待消费
生产了 : 27号产品
消费了 : 26号产品
正在等待消费
生产了 : 28号产品
消费了 : 27号产品
正在等待消费
生产了 : 29号产品
消费了 : 28号产品
消费了 : 29号产品
消费了 : 7号产品
消费了 : 5号产品
消费了 : 3号产品
消费了 : 1号产品
这是我写的一个生产者与消费者的程序,缓冲区满的时候,等待消费,理应先进行消费,为什么先执行的生产呢?程序的问题出在哪里呢?
这里通知了一个正在等待的线程。push方法上的
生产者被唤醒,然后这时又轮到生产者线程执行
所以生产者先打印,然后又回到消费者,消费者再打印。
不知道理解的对不对,等待更明确的解答......
public class ProducerConsumer{
public ProducerCustomer(){
}
static SyncStack ss = new SyncStack();
static Producer p = new Producer(ss);
static Consumer c = new Consumer(ss);
public static void main(String[] args) {
new Thread(p).start();
new Thread(c).start();
}
}class WoTou { //产品类
int id;
WoTou(int id) {
this.id = id;
}
public String toString() {
return " : " + id;
}
}class SyncStack { //栈,用来当容器
int index = 0;
WoTou[] arrWT = new WoTou[5];
ProducerCustomer pc = new ProducerCustomer();
public void push(WoTou wt) { //产品入栈(生产)
while(index == arrWT.length) {
try {
synchronized(this){
System.out.println("正在等待消费");
this.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}synchronized(pc.c) {
pc.c.notify();
}
arrWT[index] = wt;
index ++;
}
public WoTou pop() { //产品出栈(消费)
ProducerCustomer pc = new ProducerCustomer();
while(index == 0) {
try {
synchronized(this){
System.out.println("正在等待生产");
this.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}synchronized(pc.ss){
pc.ss.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<30; i++) {
WoTou wt = new WoTou(i);
ss.push(wt);
System.out.println("生产了" + wt + "号产品");
try {
Thread.sleep(500);
} 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<30; i++) {
WoTou wt = ss.pop();
System.out.println("消费了" + wt + "号产品");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
结果:生产了 : 0号产品
消费了 : 0号产品
生产了 : 1号产品
消费了 : 1号产品
生产了 : 2号产品
生产了 : 3号产品
消费了 : 3号产品
生产了 : 4号产品
生产了 : 5号产品
消费了 : 5号产品
生产了 : 6号产品
生产了 : 7号产品
消费了 : 7号产品
生产了 : 8号产品
生产了 : 9号产品
正在等待消费
消费了 : 9号产品
生产了 : 10号产品
正在等待消费
正在等待消费
消费了 : 10号产品
生产了 : 11号产品
消费了 : 11号产品
生产了 : 12号产品
正在等待消费
消费了 : 12号产品
生产了 : 13号产品
正在等待消费
正在等待消费
消费了 : 13号产品
生产了 : 14号产品
消费了 : 14号产品
生产了 : 15号产品
正在等待消费
消费了 : 15号产品
生产了 : 16号产品
正在等待消费
正在等待消费
消费了 : 16号产品
生产了 : 17号产品
消费了 : 17号产品
生产了 : 18号产品
正在等待消费
消费了 : 18号产品
生产了 : 19号产品
正在等待消费
正在等待消费
消费了 : 19号产品
生产了 : 20号产品
消费了 : 20号产品
生产了 : 21号产品
正在等待消费
消费了 : 21号产品
生产了 : 22号产品
正在等待消费
正在等待消费
消费了 : 22号产品
生产了 : 23号产品
消费了 : 23号产品
生产了 : 24号产品
正在等待消费
消费了 : 24号产品
生产了 : 25号产品
正在等待消费
正在等待消费
消费了 : 25号产品
生产了 : 26号产品
消费了 : 26号产品
生产了 : 27号产品
正在等待消费
消费了 : 27号产品
生产了 : 28号产品
正在等待消费
正在等待消费
消费了 : 28号产品
生产了 : 29号产品
消费了 : 29号产品
消费了 : 8号产品
消费了 : 6号产品
消费了 : 4号产品
消费了 : 2号产品