站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题java多线程中生产者和消费者问题

java多线程中生产者和消费者问题

摘要: java多线程中生产者和消费者问题


/*
* 创建日期 2006-9-8
*
* TODO 要更改此生成的文件的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
package sendproc;

/**
* @author Administrator
*
* TODO 要更改此生成的类型注释的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
class Stack
{
int count;
String[] data=new String[20];
public synchronized void push(String str)
{
while(count==data.length)
{
try
{
this.wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
this.notify();
data[count]=str;
count++;
}
public synchronized String get()
{
while(count==0)
{
try
{
this.wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
this.notify();
count=count-1;
return data[count];

}
}
class Producer implements Runnable
{
Stack Stackone;
public Producer(Stack s)
{
Stackone=s;
}
public void run()
{
String str;
for(int i=0;i-#60;20;i++)
{
str=String.valueOf(i+1);
Stackone.push(str);
System.out.println(-#34;Product:-#34;+str+-#34; count=-#34;+Stackone.count);
try
{
Thread.sleep((int)(Math.random()*100));
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
class Coumter implements Runnable
{
Stack stackOne;
public Coumter(Stack s)
{
stackOne=s;
}
public void run()
{
String s;
for(int i=0;i-#60;20;i++)
{
s=stackOne.get();
System.out.println(-#34;Coumet:-#34;+s+-#34; count=-#34;+stackOne.count);
try
{
Thread.sleep((int)(Math.random()*100));
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
public class StackTest {

public static void main(String[] args) {
Stack s=new Stack();
Producer p=new Producer(s);
Coumter c=new Coumter(s);
Thread t1=new Thread(p);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}此为生产者和消费者模型,操作栈
但是执行结果却如下:

Product:1 count=1
Coumet:1 count=0
Coumet:2 count=0
Product:2 count=0
Coumet:3 count=0
Product:3 count=0
Product:4 count=1
Coumet:4 count=0
Product:5 count=1
Coumet:5 count=0
Product:6 count=1
Coumet:6 count=0
Coumet:7 count=0
Product:7 count=0
Product:8 count=1
Coumet:8 count=0
Coumet:9 count=0
Product:9 count=0
Coumet:10 count=0
Product:10 count=0
Coumet:11 count=0
Product:11 count=0
Coumet:12 count=0
Product:12 count=0
Coumet:13 count=0
Product:13 count=0
Product:14 count=1
Product:15 count=2
Coumet:15 count=1
Product:16 count=2
Product:17 count=3
Coumet:17 count=2
Product:18 count=3
Product:19 count=4
Coumet:19 count=3
Product:20 count=4
Coumet:20 count=3
Coumet:18 count=2
Coumet:16 count=1
Coumet:14 count=0

我实在弄不懂 为什么会出现

Product:1 count=1
Coumet:1 count=0
Coumet:2 count=0
这种情况呢?
生产者还没生产出来 消费者就消费掉了,请各位高手给小弟指点一二。



/*
* Copyright (c) 2005-2006, AnQ Systems, Ltd.
*
* $Id: Exp $
*
* $Source$
*
*/
package sendproc;

class Stack {
int count;

String[] data = new String[20];

public synchronized void push(String str) {
while (count == data.length) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(-#34;Product:-#34; + str + -#34; count=-#34; + count);
this.notify();
data[count] = str;
count++;
}

public synchronized String get() {
while (count == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count --;
System.out.println(-#34;Coumet:-#34; + data[count] + -#34; count=-#34; + count);
this.notify();
return data[count];

}
}

class Producer implements Runnable {
Stack Stackone;

public Producer(Stack s) {
Stackone = s;
}

public void run() {
String str;
for (int i = 0; i -#60; 20; i++) {
str = String.valueOf(i + 1);
Stackone.push(str);
//System.out.println(-#34;Product:-#34; + str + -#34; count=-#34; + Stackone.count);
try {
Thread.sleep((int) (Math.random() * 100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

class Coumter implements Runnable {
Stack stackOne;

public Coumter(Stack s) {
stackOne = s;
}

public void run() {
String s;
for (int i = 0; i -#60; 20; i++) {
s = stackOne.get();
// System.out.println(-#34;Coumet:-#34; + s + -#34; count=-#34; + stackOne.count);
try {
Thread.sleep((int) (Math.random() * 100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public class StackTest {

public static void main(String[] args) throws InterruptedException {
Stack s = new Stack();
Producer p = new Producer(s);
Coumter c = new Coumter(s);
Thread t1 = new Thread(p);
Thread t2 = new Thread(c);
t1.start();
//Thread.sleep(5000);
t2.start();
}
}



PC 程序写的没有什么问题。 你看到到现象,是因为System.out.println 没有同步 。



同意楼上的
System.out.println()没有同步
建议在每个print中都加入timestamp
system.getmillsecond()取得微秒时间



Stackone.push(str);和System.out.println(-#34;Product:-#34;+str+-#34; count=-#34;+Stackone.count);
中间是可以被消费者线程中断的,估计是生产者产生了两个元素,但在第二个元素被打印出来前消费者线程运行了两次,所以看到的是你说的结果。不知对否



我有点明白了 是不是说程序没有错 我看到的有时间误差啊? 非常感谢!


在STACK中设个flag看是否有放数据,在每次push get时都判断一下


↑返回目录
前一篇: 问个低级又简单的问题?
后一篇: 请教: eclipse设置问题