多线程-BlockingQueue

发布于 2017-02-15 11:13:09 字数 1876 浏览 1302 评论 2

请输入图片描述

import java.util.concurrent.BlockingQueue;
public class Producer extends Thread {
private BlockingQueue<String> bQueue;
public Producer(String name,BlockingQueue<String> bQueue){
super(name);
this.bQueue = bQueue;
}
@Override
public void run() {
String[]que = {"java","c#","c++"};
for (int i = 0; i < 99999999; i++) {
String objString = que[i%3];
try {
Thread.sleep(1000);
this.bQueue.put(objString);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"完成生产产品"+bQueue);
}
}
}

public class Consumer extends Thread{
private BlockingQueue<String> bQueue ;
public Consumer(String name,BlockingQueue<String> bQueue){
super(name);
this.bQueue = bQueue;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
this.bQueue.take();

} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"消费产品"+bQueue);
}
}
}
public class Test {
public static void main(String[] args) {
BlockingQueue<String> bQueue = new ArrayBlockingQueue<>(1);
new Producer("111",bQueue).start();
new Producer("222",bQueue).start();
new Producer("333",bQueue).start();
new Consumer("消费者",bQueue).start();
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

虐人心 2017-09-13 15:03:05

因为你对blockingqueue 的操作 和后面的打印, 这两个操作 不是原子的.

其实一个producer的时候, 你就可以看到你说的"生产多个,然后消费多个".
举例说,
consumer 等待, producer bQueue.put(objString)后, consumer被释放;
接下来, 究竟是producer还是consumer 先做打印操作就完全随机了.

灵芸 2017-06-11 01:01:13

你的生产者有多个,但是只能要求队列里面最多有一个,也就是说一个生产组产生一个,所有生产者必须等待消费者消费完才能再生产。可以用一个原子变量,当消费者消费一个,就通知生产者生产,否则生产者处于等待状态

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文