zoukankan      html  css  js  c++  java
  • Java线程:堵塞队列与堵塞栈

    一、堵塞队列

      Java定义了堵塞队列的接口java.util.concurrent.BlockingQueue,堵塞队列是一个指定长度的队列,当试图向队列中添加元素而队列已满,或者是想从队列移出元素而队列为空的时候,堵塞队列导致线程堵塞。

      在协调多个线程之间的合作时,堵塞队列是一个有用的工具。

      堵塞队列的方法分为三类,取决于当队列满或空时它们的相应方式。

        1、如果将队列当作线程管理工具使用,用到put()(添加一个元素)和take()(移出并返回头元素)方法。

        2、当试图向满的队列中添加或从从空的队列中移出元素时,用到add()、remove()(移出并返回头元素)、element()(返回队列的头元素)。

        3、在一个线程中,队列会在任何时候空或满时,用offer()(添加一个元素并返回true)、poll()(移出并返回队列的头元素)、peek()(返回队列的头元素)替代。这些方法如果不能完成任务,不会抛出异常,只会给出一个错误。

    简单的例子:

      QueueTest.java

     1 package Thread;
     2 
     3 import java.util.concurrent.ArrayBlockingQueue;
     4 import java.util.concurrent.BlockingQueue;
     5 
     6 public class QueueTest {
     7     public static void main(String[] args)throws InterruptedException{
     8         BlockingQueue bqueue=new ArrayBlockingQueue(20);
     9         for (int i=0;i<30;i++){
    10             bqueue.put(i);
    11             System.out.println("向堵塞队列中添加了元素:"+i);
    12         }
    13         System.out.println("程序运行结束,即将退出---");
    14     }
    15 }
    View Code

      结果为:

     1 向堵塞队列中添加了元素:0
     2 向堵塞队列中添加了元素:1
     3 向堵塞队列中添加了元素:2
     4 向堵塞队列中添加了元素:3
     5 向堵塞队列中添加了元素:4
     6 向堵塞队列中添加了元素:5
     7 向堵塞队列中添加了元素:6
     8 向堵塞队列中添加了元素:7
     9 向堵塞队列中添加了元素:8
    10 向堵塞队列中添加了元素:9
    11 向堵塞队列中添加了元素:10
    12 向堵塞队列中添加了元素:11
    13 向堵塞队列中添加了元素:12
    14 向堵塞队列中添加了元素:13
    15 向堵塞队列中添加了元素:14
    16 向堵塞队列中添加了元素:15
    17 向堵塞队列中添加了元素:16
    18 向堵塞队列中添加了元素:17
    19 向堵塞队列中添加了元素:18
    20 向堵塞队列中添加了元素:19
    View Code

    二、栈

      对于堵塞栈,与堵塞队列相似,不同点是后入先出的结构,每次操作的都是栈顶,而队列是先进先出的结构,每次操作的对列头。堵塞栈定义了新街口java.util.concurrentBlockingDeque。例子:

      DequeTest.java

     1 package Thread;
     2 import java.util.concurrent.BlockingDeque;
     3 import java.util.concurrent.LinkedBlockingDeque;
     4 public class QueueTest {
     5     public static void main(String[] args)throws InterruptedException{
     6         BlockingDeque bqueue=new LinkedBlockingDeque(20);
     7         for (int i=0;i<30;i++){
     8             bqueue.put(i);
     9             System.out.println("向堵塞队列中添加了元素:"+i);
    10         }
    11         System.out.println("程序运行结束,即将退出---");
    12     }
    13 }
    View Code

      结果为:

     1 向堵塞栈中添加了元素:0
     2 向堵塞栈中添加了元素:1
     3 向堵塞栈中添加了元素:2
     4 向堵塞栈中添加了元素:3
     5 向堵塞栈中添加了元素:4
     6 向堵塞栈中添加了元素:5
     7 向堵塞栈中添加了元素:6
     8 向堵塞栈中添加了元素:7
     9 向堵塞栈中添加了元素:8
    10 向堵塞栈中添加了元素:9
    11 向堵塞栈中添加了元素:10
    12 向堵塞栈中添加了元素:11
    13 向堵塞栈中添加了元素:12
    14 向堵塞栈中添加了元素:13
    15 向堵塞栈中添加了元素:14
    16 向堵塞栈中添加了元素:15
    17 向堵塞栈中添加了元素:16
    18 向堵塞栈中添加了元素:17
    19 向堵塞栈中添加了元素:18
    20 向堵塞栈中添加了元素:19
    View Code
    当神已无能为力,那便是魔渡众生
  • 相关阅读:
    博客CSS样式 二
    产品经理
    HttpClient调用doGet、doPost、JSON传参及获得返回值
    Maven无法下载com.oracle:ojdbc.jar解决方法
    EasyExcel导入导出
    centos7 安装supervisor教程以及常见问题
    Django与Celery的安装使用
    亚马逊广告api v2版php扩展库
    Mac VMware Fusion CentOS7 安装、配置静态IP文档
    常见Web安全问题攻防解析
  • 原文地址:https://www.cnblogs.com/liuzhongfeng/p/5068458.html
Copyright © 2011-2022 走看看