- 浏览: 422200 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (170)
- java (77)
- javascript (5)
- jsp (1)
- servlet (6)
- struts (8)
- hibernate (3)
- spring (4)
- ajax (5)
- jquery (3)
- apache cxf (0)
- ext.js (1)
- hadoop (0)
- android (0)
- html5 (2)
- linux (5)
- flex (1)
- tomcat (1)
- jboss (0)
- nginx (0)
- mysql (16)
- sql server (3)
- oracle (4)
- div+css (0)
- mybatis (4)
- design patterns (22)
- xml (2)
- postgresql (3)
- velocity (1)
- freemarker (1)
- kendo-ui (2)
- ibatis (1)
- socket (1)
- C and C++ (1)
- C# (2)
- 程序设计----算法 (0)
- jersey (1)
- dd (0)
- perl (1)
- shell (0)
最新评论
-
书策稠浊:
兄弟,这tm是Java?
java调用百度地图和谷歌地图 -
fengyunlouyanyu:
jquery----删除指定id的div下的img -
yangjianzhouctgu:
Neoman 写道hi,我看你引入了kendo.web.min ...
kendo-ui中kendoGrid的用法 -
Neoman:
hi,我看你引入了kendo.web.min.js 这个js, ...
kendo-ui中kendoGrid的用法 -
yangjianzhouctgu:
<div class="quote_title ...
java调用百度地图和谷歌地图
使用一个线程将一个指定目录下面的所有文件放在一个阻塞队列中,用一定数量的线程从该队列
中读取文件,然后在该文件中查找指定关键字。该程序展示了阻塞队列的功能。阻塞队列的大小
指定,当队列已满或者为空时,相应向队列放入文件的线程或者从队列中读取文件的线程将会阻
塞。该应用是一个典型的生产者-消费者模式。
源代码如下:
运行结果:
中读取文件,然后在该文件中查找指定关键字。该程序展示了阻塞队列的功能。阻塞队列的大小
指定,当队列已满或者为空时,相应向队列放入文件的线程或者从队列中读取文件的线程将会阻
塞。该应用是一个典型的生产者-消费者模式。
源代码如下:
package com.thread.blockQueue; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Scanner; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; /** * this is a BlockingQueue test * @author yangjianzhou * @description TODO * @time Oct 29, 2014 : 9:55:19 PM */ public class BlockingQueueTest { public static void main(String[] args) { String baseDirectory = "/home/yangjianzhou/document"; String keyword = "java"; 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(baseDirectory)); new Thread(enumerator).start(); for (int i = 1; i <= SEARCH_THREADS; i++) { new Thread(new SearchTask(queue, keyword)).start(); } } } /** * this class is to put file into the queue * @author yangjianzhou * @description TODO * @time Nov 5, 2014 : 10:30:20 PM */ class FileEnumerationTask implements Runnable { public static File DUMMY = new File(""); private BlockingQueue<File> queue; private File startingDirectory; public FileEnumerationTask(BlockingQueue<File> queue, File startingDirectory) { this.queue = queue; this.startingDirectory = startingDirectory; } @Override public void run() { try { enumerate(startingDirectory); queue.put(DUMMY); } catch (InterruptedException e) { e.printStackTrace(); } } /** * enumerate the directory and put the file into queue and if element is directory * and enumerate the directory and so on * @param directory * @throws InterruptedException */ public void enumerate(File directory) throws InterruptedException { File[] files = directory.listFiles(); for (File file : files) { if (file.isDirectory()) { enumerate(file); } else { queue.put(file); } } } } /** * search keyword in the blockingQueue that contains file * @author yangjianzhou * @description TODO * @time Nov 5, 2014 : 10:27:20 PM */ class SearchTask implements Runnable { private BlockingQueue<File> queue; private String keyword; public SearchTask(BlockingQueue<File> queue, String keyword) { this.queue = queue; this.keyword = keyword; } /** * run the searchTask thread , this thread gets the blockingQueue and take file from the queue * and search keyword in the file */ @Override public void run() { try { boolean done = false; while (!done) { /*if the queue is empty , this thread is blocked , while the queue is not empty, this thread is to run*/ File file = queue.take(); System.out.println("Thread name : " +Thread.currentThread().getName()+" , queue size : "+ queue.size()); if (file == FileEnumerationTask.DUMMY) { queue.put(file); done = true; } else { search(file); } } } catch (Exception e) { e.printStackTrace(); } } /** * search keyword in the specify file , if the file contains the given keyword , print the line info * @param file * @throws IOException */ 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(); if (line.contains(keyword)) { System.out.printf("%s;%d;%s%n", file.getPath(), lineNumber, line); } } in.close(); } }
运行结果:
Thread name : Thread-2 , queue size : 4 Thread name : Thread-26 , queue size : 2 Thread name : Thread-27 , queue size : 2 Thread name : Thread-25 , queue size : 4 Thread name : Thread-1 , queue size : 1 Thread name : Thread-53 , queue size : 0 Thread name : Thread-24 , queue size : 0 Thread name : Thread-56 , queue size : 9 Thread name : Thread-30 , queue size : 10 Thread name : Thread-57 , queue size : 7 Thread name : Thread-28 , queue size : 7 Thread name : Thread-58 , queue size : 6 Thread name : Thread-10 , queue size : 5 Thread name : Thread-59 , queue size : 3 Thread name : Thread-60 , queue size : 2 Thread name : Thread-61 , queue size : 1 Thread name : Thread-55 , queue size : 0 Thread name : Thread-91 , queue size : 0 Thread name : Thread-62 , queue size : 0 Thread name : Thread-96 , queue size : 9 Thread name : Thread-10 , queue size : 8 Thread name : Thread-50 , queue size : 8 Thread name : Thread-51 , queue size : 8 Thread name : Thread-6 , queue size : 8 Thread name : Thread-52 , queue size : 8 Thread name : Thread-49 , queue size : 8 Thread name : Thread-48 , queue size : 5 Thread name : Thread-47 , queue size : 6 Thread name : Thread-46 , queue size : 7 Thread name : Thread-45 , queue size : 8 Thread name : Thread-44 , queue size : 9 Thread name : Thread-7 , queue size : 10 Thread name : Thread-4 , queue size : 7 Thread name : Thread-2 , queue size : 8 Thread name : Thread-100 , queue size : 6 Thread name : Thread-35 , queue size : 0 Thread name : Thread-54 , queue size : 7 Thread name : Thread-42 , queue size : 0 Thread name : Thread-8 , queue size : 6 Thread name : Thread-41 , queue size : 1 Thread name : Thread-63 , queue size : 5
发表评论
-
spring boot应用测试框架介绍
2018-07-19 14:44 702个人原创博客:spring boot应用测试框架介绍 -
可执行jar包的配置与运行
2017-06-04 19:42 966spring boot项目可以以jar包的形式执行运行。s ... -
多线程并发
2016-05-21 23:49 0Splitter.on('|').trimResults(). ... -
jdk动态代理实现原理
2016-05-09 23:12 719jdk的动态代理即使用反射来实现,具体由Proxy、Invoc ... -
spring常见注解
2016-05-01 23:33 11821.Autowired 通过spring的依赖注入功能来 ... -
spring常见配置作用
2016-04-29 23:08 894一般应用中常见spring的 ... -
数据来自两个系统时的内存分页算法
2016-04-24 23:12 788业务数据来自a-app与b-app,其中a-app中数据的业务 ... -
linux下java web开发环境搭建
2016-04-10 14:09 1099一般的java web开发涉及到的开发工具有:jdk、tomc ... -
linux下md5sum和DigestUtils.md5Hex的关系
2015-12-19 22:30 8449本文对linux下md5sum命令和java中DigestUt ... -
基于jersey的web service
2015-11-22 22:55 972本文是基于jersey的web service 的两个小例子, ... -
面试总结----spring
2015-05-19 22:17 871spring在面试中经常被 ... -
面试总结----多线程
2015-05-18 22:10 861面试过程中,多线程被问到的概率非常大,差不多都会问的。 下面 ... -
面试总结----java虚拟机
2015-05-17 23:20 715在面试过程中,java虚拟机被问到的概率非常大,应该是每场面试 ... -
面试总结----java集合
2015-05-17 11:57 632春节刚过,打算换一份工作,于是就开始了一段准备面试的生活,准备 ... -
json串与对象之间转换的几种实现方式
2015-01-24 18:56 1836这里使用了gson,fastjson,jackson,json ... -
google关于事件的生产者消费者模式实现例子
2015-01-24 11:28 928google使用生产者/消费者模式实现了事件的产生传播处理过程 ... -
图形化显示---冒泡排序
2014-12-05 22:17 879代码: package com.thread.singal ... -
多线程----wait/notify
2014-11-06 22:06 652线程同步:两个线程依次对同一变量进行操作。 packag ... -
迷宫的最短路径
2014-08-19 00:31 3732代码如下: package com.chapterO ... -
深度优先遍历------部分和问题
2014-08-15 20:15 477代码如下: package com.chapterO ...
相关推荐
支持多线程的阻塞队列,使用模板技术,可存储任意类型数据
Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: ...Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器
详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...
实现消息队列的关键因素是考量不同线程访问消息队列的同步问题。本实现涉及到几个知识点 std::lock_guard 介绍 std::lock_gurad 是 C++11 中定义的模板类。定义如下: template <class> class lock_guard; lock_...
实现java模拟阻塞队列的例子,该代码包括,阻塞队列实现生产者,消费者。和模拟阻塞队列实现生产者及消费者模式,帮助你更好的理解java多线程
2.添加到队列的新task是同步运行(当前线程阻塞)还是异步(当前线程不阻塞) 3.多个队列之间的调度(此文章未涉及) // // 单线程和多线程并发队列测试(同步和异步) // // 基础原理: // 1)队列: // 1.1 dispatch_...
SimpleFork提供一套类似于JAVA多线程的进程控制接口,提供回收、同步、互斥、通信等方案,开发者可以关注业务问题,不需要过多考虑进程控制。 引入 composer require jenner/simple_fork require path/to/...
练习 Java 多线程编程技术。 练习实现网络并发服务的编程技术。 学习如何实现多线程间的相互同步和相互协作。 理解什么是线程安全。 二. 设计要求 功能概述:实现一个支持并发服务的网络运算服务器程序。该服务器...
1. 什么是线程? 2. 什么是线程安全和线程不安全? 3. 什么是⾃旋锁? 4. 什么是CAS? 5. 什么是乐观锁和悲观锁? 6. 什么是AQS?...如何使⽤阻塞队列来实现⽣产者-消费者模型? 10. 什么是Callable和Future?
我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。我们来讨论另外一类容器:阻塞队列。 在前面我们...
最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题。... 我不想用一个像 cerely(一种分布式任务队列)一样大而全的任务队列框架,因为框架对于我的这点需求来说太重了,并且我的绘图也并不
Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:深入ThreadLocal 一、标准例子 二、不用ThreadLocal 三、自己...
实现了一个多线程安全的循环队列,并能以阻塞方式出队,提供效率,
多线程中的饥饿,其意思是,线程的调度如果只考虑线程优先级的话,那么在线程执行队列中,如果有高优先级的线程插入,该线程就会插入到低优先级线程的前方,这样可能导致低优先级的线程无法执行,最终造成低优先级...
看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...
java多线程实现生产者和消费者 ,4种实现方式,分别为synchronizated,condition和lock,信号量,阻塞队列
使用队列做缓冲池,通过工作者线程来处理并任务,实现线程空闲时阻塞,有任务令牌时回复服务。
使用多线程和阻塞队列实现了ABC字母按顺序轮流打印