个人随笔
目录
并发(十二)、阻塞队列ArrayBlockingQueue代码例子
2021-05-10 21:37:37

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。

下面模拟一种场景,其两个线程,一个放内容到队列中,一个取线程,代码如下:

  1. public class BlockingQueueTest {
  2. public static void main(String[] args) {
  3. BlockingQueue<String> bq = new ArrayBlockingQueue<String>(10);
  4. new Thread(new Runnable() {
  5. @Override
  6. public void run() {
  7. try {
  8. int i = 0;
  9. while(true) {
  10. i++;
  11. System.out.println("放入:"+i);
  12. bq.put(i+""+new Date());
  13. Thread.sleep(1000);
  14. }
  15. } catch (InterruptedException e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. }
  19. }
  20. }).start();
  21. new Thread(new Runnable() {
  22. @Override
  23. public void run() {
  24. try {
  25. while(true) {
  26. String i =bq.take();
  27. System.out.println("取出:"+i);
  28. Thread.sleep(2000);
  29. }
  30. } catch (InterruptedException e) {
  31. // TODO Auto-generated catch block
  32. e.printStackTrace();
  33. }
  34. }
  35. }).start();
  36. }
  37. }

从上面的代码可以推测,第一个线程是一秒钟放一次,第二个线程是两秒钟取一次,阻塞队列的长度为10,那么可以推测,一开始是每放入两次取一次,那么在放入20次后阻塞队列才会放慢,此刻开始才是放入和取出循环操作,运行结果如下。

  1. 放入:1
  2. 取出:1Mon May 10 21:27:08 CST 2021
  3. 放入:2
  4. 放入:3
  5. 取出:2Mon May 10 21:27:09 CST 2021
  6. 放入:4
  7. 放入:5
  8. 取出:3Mon May 10 21:27:10 CST 2021
  9. 放入:6
  10. 放入:7
  11. 取出:4Mon May 10 21:27:11 CST 2021
  12. 放入:8
  13. 取出:5Mon May 10 21:27:13 CST 2021
  14. 放入:9
  15. 放入:10
  16. 取出:6Mon May 10 21:27:14 CST 2021
  17. 放入:11
  18. 放入:12
  19. 取出:7Mon May 10 21:27:15 CST 2021
  20. 放入:13
  21. 放入:14
  22. 取出:8Mon May 10 21:27:16 CST 2021
  23. 放入:15
  24. 放入:16
  25. 取出:9Mon May 10 21:27:17 CST 2021
  26. 放入:17
  27. 放入:18
  28. 取出:10Mon May 10 21:27:18 CST 2021
  29. 放入:19
  30. 放入:20
  31. 取出:11Mon May 10 21:27:19 CST 2021
  32. 放入:21
  33. 放入:22
  34. 取出:12Mon May 10 21:27:20 CST 2021
  35. 放入:23
  36. 取出:13Mon May 10 21:27:21 CST 2021
  37. 放入:24
  38. 取出:14Mon May 10 21:27:22 CST 2021
  39. 放入:25
  40. 取出:15Mon May 10 21:27:23 CST 2021
  41. 放入:26
  42. 取出:16Mon May 10 21:27:24 CST 2021
  43. 放入:27
  44. 取出:17Mon May 10 21:27:25 CST 2021
  45. 放入:28
  46. 取出:18Mon May 10 21:27:26 CST 2021
  47. 放入:29
  48. 取出:19Mon May 10 21:27:27 CST 2021
  49. 放入:30

这里有一篇文章写的很详细:https://www.cnblogs.com/bjxq-cs88/p/9759571.html

 310

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2