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

转载于:https://www.cnblogs.com/sunxucool/archive/2013/03/13/2957377.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果怎么付费购买内存_【苹果手机多长时间清理一次内存,怎么清理?】

一、微信缓存微信作为每天使用频率最多的软件&#xff0c;是需要重点清理的对象。操作&#xff1a;我—设置—通用—清理微信存储空间—查看微信存储空间&#xff0c;选择联系人进行清理。二、短信现在很少有人会用短信联系&#xff0c;一般都是一些垃圾广告&#xff0c;我们可…

用计算机计算2的31次方,2的31次方,用什么方法可以最快算出来呢

请告诉我过程和怎么算出来的好吗? 2-2的2次方....-2的19次方 2的20次方2 - 2^2 - 2^3 - 2^4 - 。。。。 -2^19 2^202 2^20 - ( 2^2 2^3 2^4 。。。。 2^19)学过等比数列吗&#xff0c;学过就用公式Sna1(1-q^n)/(1/q)(a1-q*an)/(1-q)2^2 2^3 2^4 。 。。。 2^19 2^2(1-2^18)/(…

发票管理软件_财务人员都在用的这款发票管理软件,真的值得购买么?

(1)电子凭证和纸质会计凭证具有同等效力&#xff1b;(2)报销管理也需要经办、审核、审批流程&#xff0c;且能防止重复入账&#xff1b;(3)以电子凭证纸质版入账留档保存的&#xff0c;必须同时保存电子档。以及重复繁琐的发票查验工作&#xff0c;把最近处于风口浪尖的电子发票…

SDL以及扩展库的交叉编译过程简介

下面我介绍一下SDL以及SDL的扩展库在arm11上的交叉编译 在这里我将SDL 交叉编译的相关都安装在/opt/arm目录下 相关简介&#xff1a; SDL官方网站 http://www.libsdl.org/ SDL编译移植(Up-teach6410平台) 系统环境&#xff1a;linux 移植环境&#xff1a;arm11 编译工具链&…

Ref and Out

C#中ref和out的区别&#xff1a; ref 参数需初始化&#xff0c;而out并无此要求。out 参数在调用者返回之前必须有值&#xff08;调用的函数在运行过程中确定此参数的值&#xff09;。而ref参数在调用者调用之前必须有值&#xff08;由调用者设定&#xff09;。int x; Foo(out …

自动点击器如何设置最快_铁粉技巧 | iPhone如何设置自动开关机,iPhone更改字体...

大家好我是小雷没有废话直奔主题今天让我们看下iPhone如何设置自动开关机首先需要了解的是&#xff0c;iPhone设备是不能设置自动开机的。那么如何每天自动关机呢&#xff1f;1&#xff0c;打开时钟点击计时器。2&#xff0c;点击计时结束时启动3&#xff0c;滑动页面点击停止播…

中国大学慕课计算机专业导论,2015秋计算机专业导论(大连大学)

本课程是计算机科学与技术学科的第一门课程&#xff0c;目的使学生认识和了解计算机科学与技术学科&#xff0c;了解计算机科学与技术学科的基本思维、问题求解框架及典型的方法论&#xff0c;了解计算机科学与技术学科的研究对象及科学技术体系&#xff0c;了解计算机科学与技…

编译zlib库

$ tar zxvf zlib-1.2.3.tar.gz $ cd zlib-1.2.3$ ./configure --prefix/usr/local/arm/3.4.6/arm-linux --shared $ vim MakefileCCarm-linux-gccLDSHAREDarm-linux-ld -shared$ make all$ make install注意&#xff1a;这里是安装在/usr/local/arm/3.4.6/arm-linux目录下由于…

[Buzz.Today]2013.03.14

# Google将砍掉Google Reader 最近一两年养成了每天blog的习惯&#xff0c;桌面上用Feedeamon&#xff0c;iPad上则用Reeder&#xff0c;而二者均为与Google Reader同步&#xff0c;Google这一手让我心痛哦。 [后记] Google Reader的猝死给我们的启示&#xff1a;互联网无法永远…

python contains类似函数_五步教会你用python爬虫神器PyQuery!(内含详细步骤和代码)...

前言&#xff1a;今天为大家带来的内容&#xff0c;是五步教会你用python爬虫神器PyQuery&#xff01;(内含详细步骤和代码)&#xff0c;在这里还是要啰嗦下&#xff0c;为了有更好的观赏性&#xff0c;大部分代码用图片的方式呈现出来&#xff01;喜欢的话不忘点赞关注不迷路哦…

计算机应用基础 第三版 实验报告,计算机应用基础实验报告(windows).doc

计算机应用基础实验报告(windows)实 验 报 告计算机应用基础实验报告姓名 于航 班级 0531132 学 实验日期2013.09.13课程名称 计算机应用基础 指导教师 洪菁 成绩实验名称&#xff1a;windows的基本操作实验目的&#xff1a;掌握桌面主题的设置掌握任务栏的使用和设置掌握任务切…

python 跳一跳辅助_微信跳一跳辅助自动跳Python

#-*- coding: utf-8 -*-""" 思路 核心&#xff1a;每次落稳之后截图&#xff0c;根据截图算出棋子的坐标和下一个块顶面的中点坐标&#xff0c;根据两个点的距离乘以一个时间系数获得长按的时间识别棋子&#xff1a;靠棋子的颜色来识别位置&#xff0c;通过截图…

asterisk for mipsel

任务&#xff1a;将asterisk1.8.24.0移植到rt5350上面 交叉工具链&#xff1a;mipsel-linux(3.4.2) 1. 配置asterisk&#xff0c;执行./configure --hostmipsel-linux 找不到termcap和libxml2&#xff0c;分别对他们交叉编译&#xff0c;然后将生成的库拷贝到交叉工具链的lib…

uniapp开发实例github_跨端开发痛点?送你一款Vue最流行的跨端框架——uni-app

前言今天来聊一下前端必备技能——小程序开发。从最早发布的微信小程序&#xff0c;到后来的支付宝小程序、字节跳动小程序、百度小程序、QQ小程序&#xff0c;还有最近发布的360小程序&#xff0c;面对这么多套的代码&#xff0c;开发者该如何开发呢&#xff1f;当业务要求同时…

计算机怎么把单元格内容水平居中,win10系统下怎样让Word中的表格内容居中

Word是我们经常会使用到的一款文字处理软件&#xff0c;其具有非常强大的功能。那么&#xff0c;我们应该怎样使Word中的表格内容居中呢&#xff1f;接下来&#xff0c;小编就以 windows10正式版系统 为例&#xff0c;给大家分享具体操作方法。具体如下:1、首先在Word软件中准备…

双稳态电路的两个稳定状态是什么_从双稳态到双“更”稳态 ——叶芳伟课题组在拓扑光子学研究方向上取得新进展...

你拿起一个计算器&#xff0c;输入“26”&#xff0c;计算器会输出“8”&#xff1b;过了一会儿&#xff0c;你又在这个计算器上输入“26”&#xff0c;它依然会输出“8”。这种靠谱的计算器——对于同一个输入&#xff0c;它始终还给我们同一个输出——我们称之为线性计算器或…

Webots实现大疆Mavic2pro无人机定点飞行

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、将无人机当成一个对象1.1定义无人机相关属性1.2定义用于控制无人机运动的代码1.3主函数实现无人机的点位固定和飞行检测 二、用键盘控制测试代码三、效果展…

【C++专题】static_cast, dynamic_cast, const_cast探讨

首先回顾一下C类型转换&#xff1a;C类型转换分为&#xff1a;隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”&#xff0c;包括以下几种情况&#xff1a;1) 算术转换(Arithmetic conversion) : 在混合类型的 算术表达式中, 最宽的数据类型成为目标转换…

浅谈程序员的职业规划

不知不觉参加工作成为程序员已经4年多&#xff0c;记得上高中的时候&#xff0c;从网络上知道了很多IT精英创业成功的例子&#xff0c;如没有读过大学的“汽车之家”创始人李想、facebook创始人马克扎克伯格&#xff0c;让我觉得互联网是个充满梦想的舞台&#xff0c;只要有想法…

python调用数据库数据创建函数_Pyhton应用程序数据库函数封装

1.函数2.迭代器3.递归4.数据库函数5.fetchall函数1.函数&#xff1a;实现指定功能代码的集合def 函数名( ) :2.在python中没有括号&#xff0c;函数体以缩进的方式进行展示快捷键&#xff1a;tab实现了函数的缩进&#xff0c;shifttab实现前移3.调用&#xff1a;函数名( )作用&…