`

多线程-----阻塞队列

    博客分类:
  • 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
分享到:
评论

相关推荐

    支持多线程和泛型的阻塞队列

    支持多线程的阻塞队列,使用模板技术,可存储任意类型数据

    Java多线程编程总结

    Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: ...Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器

    java多线程编程总结

    详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...

    C++基于消息队列的多线程实现示例代码

    实现消息队列的关键因素是考量不同线程访问消息队列的同步问题。本实现涉及到几个知识点 std::lock_guard 介绍 std::lock_gurad 是 C++11 中定义的模板类。定义如下: template &lt;class&gt; class lock_guard; lock_...

    java模拟阻塞队列

    实现java模拟阻塞队列的例子,该代码包括,阻塞队列实现生产者,消费者。和模拟阻塞队列实现生产者及消费者模式,帮助你更好的理解java多线程

    IOS开发-多线程队列测试代码

    2.添加到队列的新task是同步运行(当前线程阻塞)还是异步(当前线程不阻塞) 3.多个队列之间的调度(此文章未涉及) // // 单线程和多线程并发队列测试(同步和异步) // // 基础原理: // 1)队列: // 1.1 dispatch_...

    php多进程框架-模拟java多线程接口simple-fork-php.zip

    SimpleFork提供一套类似于JAVA多线程的进程控制接口,提供回收、同步、互斥、通信等方案,开发者可以关注业务问题,不需要过多考虑进程控制。 引入 composer require jenner/simple_fork require path/to/...

    UDP+阻塞队列+多线程

    练习 Java 多线程编程技术。 练习实现网络并发服务的编程技术。 学习如何实现多线程间的相互同步和相互协作。 理解什么是线程安全。 二. 设计要求 功能概述:实现一个支持并发服务的网络运算服务器程序。该服务器...

    java面试题_多线程(68题).pdf

    1. 什么是线程? 2. 什么是线程安全和线程不安全? 3. 什么是⾃旋锁? 4. 什么是CAS? 5. 什么是乐观锁和悲观锁? 6. 什么是AQS?...如何使⽤阻塞队列来实现⽣产者-消费者模型? 10. 什么是Callable和Future?

    Java并发编程:阻塞队列

    我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。我们来讨论另外一类容器:阻塞队列。  在前面我们...

    Python实现简单多线程任务队列

    最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题。... 我不想用一个像 cerely(一种分布式任务队列)一样大而全的任务队列框架,因为框架对于我的这点需求来说太重了,并且我的绘图也并不

    java线程详解

    Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:深入ThreadLocal 一、标准例子 二、不用ThreadLocal 三、自己...

    可以阻塞读的循环队列

    实现了一个多线程安全的循环队列,并能以阻塞方式出队,提供效率,

    Java多线程系列——-多线程的风险问题

    多线程中的饥饿,其意思是,线程的调度如果只考虑线程优先级的话,那么在线程执行队列中,如果有高优先级的线程插入,该线程就会插入到低优先级线程的前方,这样可能导致低优先级的线程无法执行,最终造成低优先级...

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    java多线程实现生产者和消费者

    java多线程实现生产者和消费者 ,4种实现方式,分别为synchronizated,condition和lock,信号量,阻塞队列

    多线程并发处理的简单实现

    使用队列做缓冲池,通过工作者线程来处理并任务,实现线程空闲时阻塞,有任务令牌时回复服务。

    java多线程实现轮流打印ABC

    使用多线程和阻塞队列实现了ABC字母按顺序轮流打印

Global site tag (gtag.js) - Google Analytics