微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > J2SE >

做了一个生产者消费者的代码,有点问题,但不知道

时间:2014-04-04 18:48  浏览:努力统计中...
求大神帮忙看看,下面贴代码 packagedesign; publicclassProducerimplementsRunnable{ Bufferbuffer; Producer(Bufferbuffer){ this.buffer=buffer; } publicvoidrun(){ for(inti=0;i10;i++){ try{ Thread.sleep(500); }catch(InterruptedException
求大神帮忙看看,下面贴代码

package design;

public class Producer implements Runnable {

Buffer buffer;


Producer(Buffer buffer) {
this.buffer = buffer;
}

public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
buffer.produce(new Policy(i+"","test"+i));
}
}
}


package design;

public class Consumer implements Runnable{

Buffer buffer;

Consumer(Buffer buffer) {
this.buffer = buffer;
}

public void run() {
if (buffer.bufferList.size() > 0) {
buffer.consume(buffer.bufferList.get(0));
}
}

}



package design;

import java.util.ArrayList;
import java.util.List;

public class Buffer {

public static List<Policy> bufferList = new ArrayList<Policy>();

public synchronized void produce(Policy policy) {
bufferList.add(policy);
System.out.println("produce" + bufferList.size());
}

public synchronized void consume(Policy policy) {
if (bufferList.size() > 0) {
bufferList.remove(policy);
System.out.println("consume" + bufferList.size());
}
}

}



package design;

public class Policy {

Policy(String policy_id,String policy_name) {
this.policy_id = policy_id;
this.policy_name = policy_name;
}

private String policy_id;

private String policy_name;

public String getPolicy_id() {
return policy_id;
}

public void setPolicy_id(String policy_id) {
this.policy_id = policy_id;
}

public String getPolicy_name() {
return policy_name;
}

public void setPolicy_name(String policy_name) {
this.policy_name = policy_name;

}


public String toString() {
return "("+policy_id+","+policy_name+")";
}
}



package design;

import java.util.ArrayList;
import java.util.List;

/**
 * 房顶上
 * @author zhan.shi
 *
 */
public class test {

public static void main(String[] args) {
Buffer buffer = new Buffer();


Thread p1 = new Thread(new Producer(buffer));

Thread c1 = new Thread(new Consumer(buffer));

Thread c2 = new Thread(new Consumer(buffer));

p1.start();
c1.start();
c2.start();

try {
p1.join();
c1.join();
c2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i = 0;i < buffer.bufferList.size();i++){
System.out.println(buffer.bufferList.get(i).toString());
}

}

}


每次执行都没有消费的线程执行 为什么?
只有在DEBUG模式下才行。
在线等

该回复于2014-04-04 17:01:41被管理员删除


你这个模型构建的有问题啊,首先你的consume的run方法中应该用while,不然线程只跑一遍。
第二,我没明白你在main里面p1.join();             c1.join();             c2.join();  要干什么。你把这段代码注掉再看看


谢谢!
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%
    ------分隔线------