SynchronousQueue的简单应用

迈不过友情╰ 2022-08-09 02:09 246阅读 0赞

SynchronousQueue的定义如下

  1. public class SynchronousQueue<E>
  2. extends AbstractQueue<E>
  3. implements BlockingQueue<E>, Serializable

从上面可以看出,它实现BlockingQueue,所以是阻塞队列,从名字看,它又是同步的。

它模拟的功能类似于生活中一手交钱一手交货这种情形,像那种货到付款或者先付款后发货模型不适合使用SynchronousQueue。
首先要知道SynchronousQueue没有容纳元素的能力,即它的isEmpty()方法总是返回true,但是给人的感觉却像是只能容纳一个元素。

另外在创建SynchronousQueue时可以传递一个boolean参数来指定它是否是访问它的线程按遵守FIFO顺序处理,true表示遵守FIFO。

下面使用SynchronousQueue模拟只能生产一个产品的生产者-消费者模型

[java] view plain copy

  1. import java.util.Random;
  2. import java.util.concurrent.SynchronousQueue;
  3. import java.util.concurrent.TimeUnit;
  4. public class Test19 {
  5. public static void main(String[] args) {
  6. SynchronousQueue queue = new SynchronousQueue();
  7. new Customer(queue).start();
  8. new Product(queue).start();
  9. }
  10. static class Product extends Thread{
  11. SynchronousQueue queue;
  12. public Product(SynchronousQueue queue){
  13. this.queue = queue;
  14. }
  15. @Override
  16. public void run(){
  17. while(true){
  18. int rand = new Random().nextInt(1000);
  19. System.out.println(“生产了一个产品:”+rand);
  20. System.out.println(“等待三秒后运送出去…”);
  21. try {
  22. TimeUnit.SECONDS.sleep(3);
  23. } catch (InterruptedException e) {
  24. e.printStackTrace();
  25. }
  26. queue.offer(rand);
  27. }
  28. }
  29. }
  30. static class Customer extends Thread{
  31. SynchronousQueue queue;
  32. public Customer(SynchronousQueue queue){
  33. this.queue = queue;
  34. }
  35. @Override
  36. public void run(){
  37. while(true){
  38. try {
  39. System.out.println(“消费了一个产品:”+queue.take());
  40. } catch (InterruptedException e) {
  41. e.printStackTrace();
  42. }
  43. System.out.println(“—————————————————————“);
  44. }
  45. }
  46. }
  47. /**
  48. * 运行结果:
  49. * 生产了一个产品:464
  50. 等待三秒后运送出去…
  51. 消费了一个产品:773

  52. 生产了一个产品:547
  53. 等待三秒后运送出去…
  54. 消费了一个产品:464

  55. 生产了一个产品:87
  56. 等待三秒后运送出去…
  57. 消费了一个产品:547

  58. */
  59. }

发表评论

表情:
评论列表 (有 0 条评论,246人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SynchronousQueue简单应用1

    使用jdk的原话: 一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因