- 浏览: 1123744 次
- 性别:
- 来自: 火星郊区
博客专栏
-
OSGi
浏览量:0
文章分类
- 全部博客 (695)
- 项目管理 (48)
- OSGi (122)
- java (79)
- Vaadin (5)
- RAP (47)
- mysql (40)
- Maven (22)
- SVN (8)
- 孔雀鱼 (10)
- hibernate (9)
- spring (10)
- css (3)
- 年审 (6)
- ant (1)
- jdbc (3)
- FusionCharts (2)
- struts (4)
- 决策分析 (2)
- 生活 (10)
- 架构设计 (5)
- 破解 (2)
- 狼文化 (4)
- JVM (14)
- J2EE (1)
- 应用服务器 (1)
- 我的链接 (5)
- 数学 (2)
- 报表 (1)
- 百科 (6)
- Flex (7)
- log4j (2)
- PHP (1)
- 系统 (2)
- Web前端 (7)
- linux (6)
- Office (1)
- 安全管理 (5)
- python (2)
- dom4j (1)
- 工作流 (3)
- 养生保健 (4)
- Eclipse (8)
- 监控开发 (1)
- 设计 (3)
- CAS (1)
- ZK (41)
- BluePrint (3)
- 工具 (1)
- SWT (7)
- google (2)
- NIO (1)
- 企业文化 (2)
- Windoes (0)
- RCP (7)
- JavaScript (10)
- UML (1)
- 产品经理 (2)
- Velocity (10)
- C (1)
- 单元测试 (1)
- 设计模式 (2)
- 系统分析师 (2)
- 架构 (4)
- 面试 (2)
- 代码走查 (1)
- MongoDB (1)
- 企业流程优化 (1)
- 模式 (1)
- EJB (1)
- Jetty (1)
- Git (13)
- IPV6 (1)
- JQuery (8)
- SSH (1)
- mybatis (10)
- SiteMesh (2)
- JSTL (1)
- veloctiy (1)
- Spring MVC (1)
- struts2 (3)
- Servlet (1)
- 权限管理 (1)
- Java Mina (1)
- java 系统信息 (6)
- OSGi 基础 (3)
- html (1)
- spring--security (6)
- HTML5 (1)
- java爬虫搜索 (1)
- mvc (3)
最新评论
-
Tom.X:
http://osgia.com/
将web容器置于OSGi框架下进行web应用的开发 -
chenyuguxing:
你好, 为什么我的bundle export到felix工程中 ...
在Apache Felix中运行bundle -
string2020:
<niceManifest>true</ni ...
Bundle Plugin for Maven -
jsonmong:
OSGI,是未来的主流,目前已相当成熟。应用OSGI比较好的, ...
基于OSGi的声明式服务 -
zyhui98:
貌似是翻译过来的,有很少人在linux上做开发吧
如何成为“10倍效率”开发者
这几天所做的项目中涉及到了队列阻塞机制,通过研究整理如下。在这里和大家分享。
队列以一种先进先出的方式。如果你向一个已经满了的阻塞队列中添加一个元素,或是从一个空的阻塞队列中移除一个元素,将导致线程阻塞。在多线程进行合作 时,阻塞队列是很有用的工具。工作者线程可以定期的把中间结果存到阻塞队列中。而其他工作者线程把中间结果取出并在将来修改它们。队列会自动平衡负载。如 果第一个线程集运行的比第二个慢,则第二个线程集在等待结果时就会阻塞。如果第一个线程集运行的快,那么它将等待第二个线程集赶上来。
下面的程序展示了如何使用阻塞队列来控制线程集。程序在一个目录及它的所有子目录下搜索所有文件,打印出包含指定关键字的文件列表。
java.util.concurrent包提供了阻塞队列的4个变种:LinkedBlockingQueue、
ArrayBlockingQueue、PriorityBlockingQueue和DelayQueue。我们用的是
ArrayBlockingQueue。ArrayBlockingQueue在构造时需要给定容量,并可以选择是否需要公平性。如果公平参数被设置了,
等待时间最长的线程会优先得到处理。通常,公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用它。
生产者线程枚举在所有子目录下的所有文件并把它们放到一个阻塞队列中。这个操作很快,如果队列没有设上限的话,很快它就包含了没有找到的文件。
我们同时还启动了大量的搜索线程。每个搜索线程从队列中取出一个文件,打开它,打印出包含关键字的所有行,然后取出下一个文件。我们使用了一个小技巧来
在工作结束后终止线程。为了发出完成信号,枚举线程把一个虚拟对象放入队列。(这类似于在行李输送带上放一个写着“最后一个包”的虚拟包。)当搜索线程取
到这个虚拟对象时,就将其放回并终止。
在这个程序中,我们使用队列数据结构作为一种同步机制。
- import java.io.*;
- import java.util.*;
- import java.util.concurrent.*;
- public class BlockingQueueTest
- {
- public static void main(String[] args)
- {
- Scanner in = new Scanner(System.in);
- System.out.print("Enter base directory (e.g. /usr/local/jdk1.6.0/src): " );
- String directory = in.nextLine();
- System.out.print("Enter keyword (e.g. volatile): " );
- String keyword = in.nextLine();
- final int FILE_QUEUE_SIZE = 10 ;
- final int SEARCH_THREADS = 100 ;
- BlockingQueue<File> queue = new ArrayBlockingQueue<File>(FILE_QUEUE_SIZE);
- FileEnumerationTask enumerator = new FileEnumerationTask(queue, new File(directory));
- new Thread(enumerator).start();
- for ( int i = 1 ; i <= SEARCH_THREADS; i++)
- new Thread( new SearchTask(queue, keyword)).start();
- }
- }
- /**
- * This task enumerates all files in a directory and its subdirectories.
- */
- class FileEnumerationTask implements Runnable
- {
- /**
- * Constructs a FileEnumerationTask.
- * @param queue the blocking queue to which the enumerated files are added
- * @param startingDirectory the directory in which to start the enumeration
- */
- public FileEnumerationTask(BlockingQueue<File> queue, File startingDirectory)
- {
- this .queue = queue;
- this .startingDirectory = startingDirectory;
- }
- public void run()
- {
- try
- {
- enumerate(startingDirectory);
- queue.put(DUMMY);
- }
- catch (InterruptedException e)
- {
- }
- }
- /**
- * Recursively enumerates all files in a given directory and its subdirectories
- * @param directory the directory in which to start
- */
- public void enumerate(File directory) throws InterruptedException
- {
- File[] files = directory.listFiles();
- for (File file : files)
- {
- if (file.isDirectory()) enumerate(file);
- else queue.put(file);
- }
- }
- public static File DUMMY = new File( "" );
- private BlockingQueue<File> queue;
- private File startingDirectory;
- }
- /**
- * This task searches files for a given keyword.
- */
- class SearchTask implements Runnable
- {
- /**
- * Constructs a SearchTask.
- * @param queue the queue from which to take files
- * @param keyword the keyword to look for
- */
- public SearchTask(BlockingQueue<File> queue, String keyword)
- {
- this .queue = queue;
- this .keyword = keyword;
- }
- public void run()
- {
- try
- {
- boolean done = false ;
- while (!done)
- {
- File file = queue.take();
- if (file == FileEnumerationTask.DUMMY)
- {
- queue.put(file);
- done = true ;
- }
- else search(file);
- }
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- catch (InterruptedException e)
- {
- }
- }
- /**
- * Searches a file for a given keyword and prints all matching lines.
- * @param file the file to search
- */
- public void search(File file) throws IOException
- {
- Scanner in = new Scanner( new FileInputStream(file));
- int lineNumber = 0 ;
- while (in.hasNextLine())
- {
- lineNumber++;
- String line = in.nextLine().trim();
- if (line.contains(keyword)) System.out.printf( "%s:%d %s%n" , file.getPath(), lineNumber, line);
- }
- in.close();
- }
- private BlockingQueue<File> queue;
- private String keyword;
-
}
发表评论
-
一个例子全部说明java泛型中的K,V,T,E,?,object的意思及其用法
2013-03-07 11:09 70021.意思 jdk中的K,V,T,E等泛型名称很多人以为 ... -
Log4j 把不同包的日志打印到不同位置
2012-11-29 08:23 1120需要的包和测试的代码下载附件! 如果需要将不同的日 ... -
Java多线程发展简史
2012-09-16 14:25 1006转自:http://www.raychase.ne ... -
Java编码易疏忽的十个问题
2012-09-06 08:52 883在Java编码中,我们容易 ... -
网络编程
2012-09-04 13:30 935计算机网络基础 什么是计算机网络 把分布在 ... -
获取Java程序运行的路径 | 获取当前jar包的路径
2012-09-04 11:55 14027经过试验,不管是否是 Jar 包,不管是否是 Tom ... -
java的concurrent用法详解
2012-08-03 11:28 975我们都知道,在JDK1.5之前,Java中要进行业务并发时 ... -
Java程序员必知的8大排序
2012-07-05 09:56 10008 种排序之间的关系: ... -
Comparator与Comparable的区别
2012-07-05 08:38 1185当需要排序的集合或数组不是单纯的数字类型的时候,通常可以使用C ... -
RSA算法Java实现
2012-06-27 08:22 1381Java代码 package c ... -
Java面试过程中会遇到的问题
2012-06-13 13:04 10891、abstract的method是否可同时是static,是 ... -
【解惑】深入jar包:从jar包中读取资源文件
2012-06-13 13:02 1068我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等)。 ... -
java 处理文件路径中的空格
2012-06-13 12:57 1498问题背景: windows下有个目录名称Program ... -
java内存分配机制
2012-06-13 12:52 1128通过这几天对一个 ... -
byte[]转化成其他数据类型
2012-05-14 16:41 1608Java与其他语言数据类型之间的转换方法实例程序 /*** ... -
java中byte转换int时为何与0xff进行与运算
2012-05-14 16:39 1029java中byte转换int时为何 ... -
java整型数与网络字节序的 byte[] 数组转换关系
2012-05-14 16:31 6416工作项目需要在 java 和 c/c++ 之间进行 ... -
利用 Base64 缩短 UUID 至22位
2012-04-15 18:57 7122UUID还是比较常用的,尤其在web应用里。 有时在UR ... -
图解Java中的值传递与引用传递(更新版)
2012-04-09 12:49 1140编程的人,都会遇到值传递与引用传递的困惑,不过很快都会迎 ... -
AWT Swing SWT JFace GWT 简介与比较
2012-03-15 13:49 4203AWT Abstract Windows To ...
相关推荐
PI解决队列堵塞问题
java中,常用的阻塞式队列Demo。包含:ArrayBlockingQueue、LinkedQueue、PriorityBlockingQueue
支持多线程的阻塞队列,使用模板技术,可存储任意类型数据
并发-线程池和阻塞队列 并发-线程池和阻塞队列 并发-线程池和阻塞队列
讲述线程池原理,线程池使用场景和注意事项,手动创建线程池方法,注意事项,阻塞队列的相关知识
实现java模拟阻塞队列的例子,该代码包括,阻塞队列实现生产者,消费者。和模拟阻塞队列实现生产者及消费者模式,帮助你更好的理解java多线程
C语言_初始化队列+入队列+出队列+销毁队列
链队列题目:初始化队列+入队列+出队列+销毁队列
此文档是C#开发的消息队列系统,适用于消息队列入门与新手。 在Windows 7 上安装消息队列的步骤 打开“控制面板”。 单击“程序”,然后在“程序和功能”下, 单击“打开或关闭 Windows 功能”。 -或者-单击“经典...
Java实现简单的阻塞队列2种方式,1使用wait(),notify();2使用countdownlatch实现
java队列实现(顺序队列、链式队列、循环队列)
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
实现了一个多线程安全的循环队列,并能以阻塞方式出队,提供效率,
阿里巴巴开源的消息队列。电商产物适用于90%的业务场景。经历双十一的考验,高可用,框架轻量级。
队列建立和队列的逆置 队列建立和队列的逆置 队列建立和队列的逆置
普通队列 1)将尾指针往后移:rear+1,当front==rear【空】 2)若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数中组元素中,否则无法存入数据。rear==maxSize-1[队列满] 环形队列 1)front变量的...
使用非阻塞队列的时候有一个很大问题是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,必须额外地实现同步策略以及线程间唤醒策略,这个实现起来非常麻烦。但是有了阻塞队列不一样了,它会
阻塞队列详解
环形队列,不加锁的生产者消费者模式,使用前提:1,缓冲区设置足够大,2,消费保证足够快