多线程-BlockingQueue
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因为你对blockingqueue 的操作 和后面的打印, 这两个操作 不是原子的.
其实一个producer的时候, 你就可以看到你说的"生产多个,然后消费多个".
举例说,
consumer 等待, producer bQueue.put(objString)后, consumer被释放;
接下来, 究竟是producer还是consumer 先做打印操作就完全随机了.
你的生产者有多个,但是只能要求队列里面最多有一个,也就是说一个生产组产生一个,所有生产者必须等待消费者消费完才能再生产。可以用一个原子变量,当消费者消费一个,就通知生产者生产,否则生产者处于等待状态