当前位置: 首页 > 编程日记 > 正文

LinkedBlockingQueue应用实例

并发库中的BlockingQueue是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列中,如果队列已经满了,就等待直到有空闲节点;后者从head取一个对象,如果没有对象,就等待直到有可取的对象。

下面的例子比较简单,一个读线程,用于将要处理的文件对象添加到阻塞队列中, 另外四个写线程用于取出文件对象,为了模拟写操作耗时长的特点,特让线程睡眠一段随机长度的时间。另外,该Demo也使用到了线程池和原子整型 (AtomicInteger),AtomicInteger可以在并发情况下达到原子化更新,避免使用了synchronized,而且性能非常高。由 于阻塞队列的put和take操作会阻塞,为了使线程退出,特在队列中添加了一个“标识”,算法中也叫“哨兵”,当发现这个哨兵后,写线程就退出。

当然线程池也要显式退出了。

package concurrent;
import java.io.File;
import java.io.FileFilter;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;

public class TestBlockingQueue {
  static long randomTime() {
    return (long) (Math.random() 1000);
  }

  public static void main(String[] args) {
    // 能容纳100个文件
    final BlockingQueue<File> queue = new LinkedBlockingQueue<File>(100);
    // 线程池
    final ExecutorService exec = Executors.newFixedThreadPool(5);
    final File root = new File("F:\\JavaLib");
    // 完成标志
    final File exitFile = new File("");
    // 读个数
    final AtomicInteger rc = new AtomicInteger();
    // 写个数
    final AtomicInteger wc = new AtomicInteger();
    // 读线程
    Runnable read = new Runnable() {
      public void run() {
        scanFile(root);
        scanFile(exitFile);
      }

      public void scanFile(File file) {
        if (file.isDirectory()) {
          File[] files = file.listFiles(new FileFilter() {
            public boolean accept(File pathname) {
              return pathname.isDirectory()
                  || pathname.getPath().endsWith(".java");
            }
          });
          for (File one : files)
            scanFile(one);
        else {
          try {
            int index = rc.incrementAndGet();
            System.out.println("Read0: " + index + " "
                + file.getPath());
            queue.put(file);
          catch (InterruptedException e) {
          }
        }
      }
    };
    exec.submit(read);
    // 四个写线程
    for (int index = 0; index < 4; index++) {
      // write thread
      final int NO = index;
      Runnable write = new Runnable() {
        String threadName = "Write" + NO;
        public void run() {
          while (true) {
            try {
              Thread.sleep(randomTime());
              int index = wc.incrementAndGet();
              File file = queue.take();
              // 队列已经无对象
              if (file == exitFile) {
                // 再次添加"标志",以让其他线程正常退出
                queue.put(exitFile);
                break;
              }
              System.out.println(threadName + ": " + index + " "
                  + file.getPath());
            catch (InterruptedException e) {
            }
          }
        }
      };
      exec.submit(write);
    }
    exec.shutdown();
  }
}

转:http://blog.sina.com.cn/s/blog_67b077fe0100zrv9.html

相关文章:

s-stat 查看文件或者文件系统的状态信息

命令用法 stat [OPTION]... FILE... -L 查看链接文件-f 查看文件系统信息&#xff0c;而非文件信息-c --format%a 支持使用格式化字符串输出结果&#xff0c;支持\n,\t等转义字符,详细格式化情况使用man stat查看--printfFORMAT 支持格式化输出-t 以简洁的方式输出结果 常用…

梦想的地方!地球上最值得去的20个地方【组图】

如果你是一个热爱大自然的人你肯定会喜欢这个集合。地球上有太多的地方和风景值得我们这辈子至少要去看一次。大多数自然摄影师喜欢没有人出现在他们的照片中&#xff0c;他们想获得纯净、完美的风景&#xff0c;没有人类的影响。这篇文章展示了20个地球上最惊人的地方的照片&a…

php读取js验证码,PHP + JS 实现验证码功能

验证码是网站防止恶意攻击最常用的手段&#xff0c;怎样使用PHP来生成验证码呢&#xff0c;下面就直接上例子首先给出生成验证码的PHP代码&#xff1a;将上面的代码放在一个单独的php文件中&#xff0c;如&#xff1a;auth_code.php&#xff0c;最好不要讲验证码的代码放到其他…

poj1692

题意&#xff1a;两个数列&#xff0c;第一行的数字可以和第二行的数字连线。连线有如下条件&#xff0c;被连上的两数字必须相等&#xff0c;且每个数字只能连一条线&#xff0c;每条连线必须与且仅与另一条连线相交&#xff0c;相交两连线上的数字不能相等。问最多能连多少条…

MongoDB 学习使用

博客教程&#xff1a; https://jingyan.baidu.com/article/dca1fa6f0428a4f1a440522e.html转载于:https://www.cnblogs.com/harlem/p/10148315.html

C语言的双向链表头插法和尾插法,指定节点删除

文章目录前言头插法尾插法删除节点测试代码如下前言 双向链表和单链表的唯一区别就是多个一个指针域而已&#xff0c;该指针域可以访问链表的上一个节点。 关于构造双向链表的过程我们常见的有两种方法&#xff0c;和单链表一样&#xff1a;头插法和尾插法。 头插法&#xff…

机房收费系统之uml图——初版

说起uml图&#xff0c;在我心中最难的当属类图无疑。虽然敲了三层的小例子&#xff0c;但真正让把三层和uml图结合起来&#xff0c;并且还要考虑设计模式的时候&#xff0c;总是让人有一种无从下手的感觉&#xff0c;不过还好&#xff0c;通过这半个多月的思考与探索&#xff0…

php扩展开发中文教程.pdf,PHP扩展开发系列教程-1

PHP的核心由两部分组成。最底层是zend引擎(ZE)。另一部分是PHP内核&#xff0c;她绑定了SAPI层(Server Application Programming Interface).###扩展的内存管理_____________________________________________________________1 依赖ZE内部管理2 自己写内存管理##创建基础hello…

node.js(一)

2019独角兽企业重金招聘Python工程师标准>>> 1.简介 Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it light…

Android Wifi 主动扫描 被动扫描

介绍主动扫描&#xff0c;被动扫描以及连接的wifi的扫描过程 参考文档 《802.11无线网络权威指南》 《80_Y0513_1_QCA_WCN36X0_SOFTWARE_ARCHITECTURE.pdf》(高通文档) 被动扫描&#xff08;passive scanning&#xff09; 可以节省电池的电力&#xff0c;因为不需要传送任何信号…

C语言的单链表实现队列

队列是一种FIFO&#xff08;先入先出&#xff09;的数据结构 C的STL std::queue q; 相关的队列操作&#xff0c;包括 q.empty() 判读队列是否为空 q.front() 返回队列的首元素 q.back() 返回队列的末尾元素 q.pop() 弹出队列的头部 q.push(x) 将x添加至队列 q.size() 返回队列…

hdu 1561 The more, The Better_树状dp

题目链接 题意&#xff1a;给你一棵树&#xff0c;各个节点都有价值&#xff08;除根节点&#xff09;&#xff0c;从根节点出发&#xff0c;选择m个节点&#xff0c;问最多的价值是多小。 思路&#xff1a;很明显是树状dp&#xff0c;遍历树时背包最优价值&#xff0c;dp[i][k…

java课设推荐,《Java程序设计》课程设计报告推荐.docx

《Java程序设计》课程设计报告推荐《Java程序设计》课程设计报告2015—2016学年 第一学期设计题目整数进制转换学生姓名邹晓刚学 号0专业班级信管1303指导教师 姜国权 2015年12月31日整数进制转换设计任务书1.1题目与要求 本人计划编写一个十进制整数转换为二八十六进制整数的进…

解析Erlang日志组件lager的lager_transform模块

为什么80%的码农都做不了架构师&#xff1f;>>> 使用 lager 的时候&#xff0c;在编译应用的时候&#xff0c;需要加入选项 {parse_transform, lager_transform} erlc 会在编译你的项目源代码的时候&#xff0c;把生成的 abstract format forms 交给 lager_transfo…

Session 常见操作

对于敏感、重要的信息&#xff0c;建议要存储在服务器端&#xff08;Session是存储在服务器端的&#xff09;&#xff0c;不能存储在浏览器中&#xff0c;如用户名、余额、等级、验证码等信息 Session依赖于Cookie session数据的获取 session:请求上下文对象&#xff0c;用于处…

C++的STL队列实现栈

使用C的队列STL实现一个栈的数据结构 实现以下四个函数&#xff1a; 1.push(x) : 将元素x压入栈中 2.pop() : 弹出(移除)栈顶元素 3.top() : 返回栈顶元素 4.empty() : 判断栈是否是空 队列的数据结构为先入先出&#xff0c;栈的数据结构为先入后出&#xff1b; 即队列的元素顺…

PHP实现XML传输

sendXML.php <!--发送XML的页面--> <?php$xml_data <xml>...</xml>;//发送的xml $url http://localhost/getXML.php;//接收XML地址$header "Content-type: text/xml";//定义content-type为xml $ch curl_init(); //初始化curl curl_setop…

wordpress短代码转php,WordPress中的shortcode短代码功能使用详解

WordPress 从 2.5 的版本开始&#xff0c;增加了一个 shortcode (短代码) API ,类似于 BBS 上的 BBCode &#xff0c; shortcode 也可以很方便的为文章或页面增加功能&#xff0c;并且 shortcode 的比起 BBCode 更加灵活和强大。下面 Kayo 为大家介绍一下 shortcode 。一.short…

在ESXi主机上关闭无响应的虚拟机

适用情况该方法适用于以下情况: ESXi主机上的虚拟机不能关闭。虚拟机无响应且不能停止。目的这篇文章描述在ESXi环境中如何正确的关闭一台无响应的虚拟机。注意&#xff1a; 这篇文章只适用于ESXi主机&#xff0c;不适用于ESX主机。对于ESX主机&#xff0c;请参考 Powering off…

React和Jquery比较

Jquery的工作方式&#xff1a; 假如你需要给一个按扭添加一个点击事件。 首先根据CSS规则找到对应的dom元素&#xff0c;挂上一个匿名事件处理函数&#xff0c;在事件处理函数中&#xff0c;选中那个需要被修改的DOM元素&#xff0c;读取他的文本值&#xff0c;加以修改&#x…

C++的STL栈实现队列

使用内部存储结构为栈的方法实现一个队列&#xff0c;要求实现该队列的如下方法&#xff1a; 1.push(x) : 将元素x压入队列中 2.pop() : 弹出(移除)队列头部元素 3.peek() : 返回队列头部元素(即为front) 4.empty() : 判断队列是否是空 栈的数据结构为先入后出&#xff0c;队列…

如何设置SOLR的高亮 (highlight)?

打开SOLR的核心配置文件&#xff1a; solrconfig.xml找到 standard request handler写入以下XML配置代码&#xff1a;[c-sharp] view plaincopy <requestHandler name"standard" class"solr.SearchHandler" default"true"> <!-- def…

java快排算法解读,java 快排的思路与算法

java 快排的思路与算法有时候面试的时候的会问道Arrays.sort()是怎么实现的&#xff0c;我以前根本不知道是什么东西&#xff0c;最近点进去看了一下。直接吓傻&#xff0c;//看到这个时候还是比较淡定的&#xff0c;可怕的事情来了。public static void sort(int[] a) {DualPi…

SQL:EXISTS的用法理解(转)

摘自&#xff1a;http://www.cnblogs.com/netserver/archive/2008/12/25/1362615.html 比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID FROM Orders o WHERE o.CustomerIDc.CustomerID) 这里面的EXISTS…

002.Heartbeat部署及httpd高可用

一 前期准备 1.1 依赖准备 编译安装需要依赖的包&#xff0c;如gcc等&#xff1a;yum -y install gcc gcc-c make glibc kernel-devel kernel-headers autoconf automake libtool glib2-devel libxml2 libxml2-devel libxslt-devel libtool-ltdl-devel wget asciidoc libuuid-d…

C++的STL栈实现获取栈中最小元素的成员

实现一个获取栈中最小数据成员的函数&#xff0c;该栈支持如下操作&#xff1a; 1.push(x) : 将元素x压入栈中 2.pop() : 弹出(移除)栈顶元素 3.top() : 返回栈顶元素 4.getMin() : 返回栈内最小元素 要求时间复杂度为O(1) 这里关键是如何获取最小值&#xff0c;栈中的元素不断…

java servlet applet,详解Java Servlet与Applet比较

Java Servlet与Applet相似之处&#xff1a;◆它们不是独立的应用程序&#xff0c;没有main()方法。◆它们不是由用户或程序员调用&#xff0c;而是由另外一个应用程序(容器)调用。◆它们都有一个生存周期&#xff0c;包含init()和destroy()方法。Java Servlet与Applet不同之处&…

NTP时间同步服务器搭建

转载&#xff1a;http://blog.s135.com/post/281/ 一、搭建时间同步服务器1、编译安装ntp server tar zxvf ntp-4.2.6.tar.gzcd ntp-4.2.6./configure --prefix/usr/local/ntp --enable-all-clocks --enable-parse-clocksmake && make install注&#xff1a;如以上下载…

OI基础系列之最大子数组问题

OI基础系列之最大子数组问题 ——Edward2414 oi退役了&#xff0c;虽然没取得多少成绩&#xff0c;也算是走过一会的人了。我相信绝大多数oi党都是自学成才&#xff0c;在此&#xff0c;我感谢那些把自己所学写到博客里的前辈们&#xff0c;没有你们&#xff0c;我不可能…

springCloud Zuul网关

1.springboot 仅2.0.x 支持&#xff0c;在此选择 2.0.7 2.新建Module eureka-zuul-client 3.导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/…