想试用一下阻塞列队 做了个生产者和消费者的 demo 预期结果就是相互交替执行也就是 生产一个之后,消费一个
不允许连续生产或者连续消费
但是如果不让生产线程 sleep 就会无法实现交替执行的效果 我是没想到是什么原因
public static void main(String[] args) throws IOException {
BlockingQueue<Integer> bq = new LinkedBlockingQueue<Integer>(1);
Producer p1 = new Producer(bq);
p1.setName("producer01");
Customer c1 = new Customer(bq);
c1.setName("customer01");
p1.start();
c1.start();
}
public class Producer extends Thread {
private BlockingQueue<Integer> bq;
public Producer(BlockingQueue<Integer> bq) {
this.bq = bq;
}
@Override
public void run() {
while (true) {
try {
bq.put(produce());
Thread.sleep(0,1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private Integer produce() {
Integer number = (new Random().nextInt(100));
System.out.println(getName() + ":produced =====> " + number);
return number;
}
}
public class Customer extends Thread {
private BlockingQueue<Integer> bq;
public Customer(BlockingQueue<Integer> bq) {
this.bq = bq;
}
@Override
public void run() {
while (true) {
try {
consume();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void consume() throws InterruptedException {
System.out.println(getName() + ":consumed:" + bq.take());
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.