当前位置:   article > 正文

java实现BlockingQueue队列_java controller层 blockingqueue

java controller层 blockingqueue

学习多线程的过程中用代码实现的BlockingQueue队列。

阻塞队列实现类。

  1. package com.xtli.controller.thread;
  2. import java.util.LinkedList;
  3. public class BlockingQueueTest {
  4. LinkedList<String> BQList = new LinkedList<String>();
  5. private int size = 0;//队列大小
  6. private int count = 0;//队列计数器
  7. private Object obj = new Object();//同步对象
  8. public BlockingQueueTest(int size) {
  9. this.size = size;
  10. }
  11. public void inQueue(String str) {
  12. synchronized(obj) {
  13. System.out.println("线程"+Thread.currentThread().getName()+":"+str+"准备进入队列。。");
  14. if(this.size == count) {
  15. try {
  16. System.out.println("线程"+Thread.currentThread().getName()+":"+"队列已满,阻塞。。");
  17. obj.wait();//等待其他线程从队列中取值
  18. } catch (InterruptedException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. BQList.add(str);
  23. count++;
  24. System.out.println("线程"+Thread.currentThread().getName()+":"+str+"成功进入队列。。");
  25. System.out.println("当前队列中的值为:"+BQList.toString());
  26. obj.notifyAll();//通知等待的其他线程
  27. }
  28. }
  29. public String outQueue() {
  30. synchronized(obj) {
  31. System.out.println("线程"+Thread.currentThread().getName()+":"+"准备从队列中取值。。");
  32. if(this.count == 0) {
  33. try {
  34. System.out.println("线程"+Thread.currentThread().getName()+":"+"队列已空,阻塞。。");
  35. obj.wait();//等待其他线程,往队列里塞值
  36. } catch (InterruptedException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. count--;
  41. String str = BQList.pollFirst();
  42. System.out.println("线程"+Thread.currentThread().getName()+":"+str+"成功出队列。。");
  43. System.out.println("当前队列中的值为:"+BQList.toString());
  44. obj.notifyAll();//通知等待的其他线程
  45. return str;
  46. }
  47. }
  48. }

启用两个线程,一个线程向队列中塞值,另外一个从队列中取值。

  1. package com.xtli.controller.thread;
  2. public class BlockingQueueMain {
  3. static BlockingQueueTest BQ = new BlockingQueueTest(3);
  4. static class BlockingQueueInQueue extends Thread {
  5. public void run() {
  6. for(int i=0;i<5;i++) {//向队列中塞了5个值
  7. BQ.inQueue(String.valueOf(i));
  8. }
  9. }
  10. }
  11. static class BlockingQueueOutQueue extends Thread {
  12. public void run() {
  13. for(int i=0;i<6;i++) {//从队列中取了6个值
  14. BQ.outQueue();
  15. }
  16. }
  17. }
  18. public static void main(String[] args) throws InterruptedException {
  19. /*final BlockingQueueTest BQ = new BlockingQueueTest(3);
  20. BQ.inQueue("1");
  21. BQ.inQueue("2");
  22. BQ.inQueue("3");
  23. Thread t1 = new Thread(new Runnable() {
  24. @Override
  25. public void run() {
  26. BQ.inQueue("4");
  27. BQ.inQueue("5");
  28. }
  29. });
  30. Thread t2 = new Thread(new Runnable() {
  31. @Override
  32. public void run() {
  33. String str1 = BQ.outQueue();
  34. System.out.println(str1);
  35. String str2 = BQ.outQueue();
  36. System.out.println(str2);
  37. }
  38. });
  39. t1.start();
  40. Thread.sleep(1000);
  41. t2.start();*/
  42. new BlockingQueueInQueue().start();
  43. new BlockingQueueOutQueue().start();
  44. }
  45. }
        在BlockingQueueMain中,BlockingQueueInQueue向队列中塞了5次值,而BlockingQueueOutQueue从队列中取了6次,前5次均能正常取出,当第6次再次取值时,因为此时队列已空,此线程会一直处于等待状态。

        BlockingQueueOutQueue如果循环5次从队列中取值,如下

     BlockingQueueInQueue如果循环6次,BlockingQueueOutQueue循环5次,结果如下。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/976212
推荐阅读
相关标签
  

闽ICP备14008679号