`

BlockingQueue+线程池

    博客分类:
  • Java
 
阅读更多

A.使用阻塞队列存储任务:Runnable,Callable,FutureTask

B.线程池从队列取任务执行:put(),take()

 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;

public class MatchCounter implements Callable<Integer> {
	
	public static void main(String[] args) {
		File directory = new File("D:\\project\\sis\\branches\\uat\\play\\test");
		String keyword = "class";
		
		//线程池
		ExecutorService pool = Executors.newCachedThreadPool();
		
		MatchCounter counter = new MatchCounter(directory, keyword, pool);
		Future<Integer> result = pool.submit(counter);
		
		try {
			System.out.println(result.get());
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {}
		
		pool.shutdown();
		
		//获取线程池同时存在线程的峰值
		ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)pool;
		int largest = threadPoolExecutor.getLargestPoolSize();
		System.out.println("largest pool size = " + largest);
	}
	
	public MatchCounter(File directory, String keyword, ExecutorService threadPool) {
		this.searchDir = directory;
		this.keyword = keyword;
		this.pool = threadPool;
		this.count = 0;
	}

	@Override
	public Integer call() throws Exception {
		ArrayList<Future<Integer>> resultList = new ArrayList<>();//保存结果集
		for(File file : searchDir.listFiles()){
			if(file.isDirectory()) {
				MatchCounter counter = new MatchCounter(file, keyword, pool);
				Future<Integer> result = pool.submit(counter);//提交新的任务
				resultList.add(result);
			} else {
				if(search(file))
					count++;
			}
		}
		for(Future<Integer> result : resultList) {
			count += result.get();//递归
		}
		return count;
	}
	
	private boolean search(File file) {
		try {
			Scanner in = new Scanner(new FileInputStream(file));
			boolean found = false;
			while(!found && in.hasNextLine()) {
				String line = in.nextLine();
				if(line.contains(keyword))
					found = true;
			}
			in.close();
			return found;
		} catch (FileNotFoundException e1) {
			return false;
		}
	}

	private int count;
	private File searchDir;
	private String keyword;
	private ExecutorService pool;
}

 

分享到:
评论

相关推荐

    BlockingQueue队列自定义超时时间取消线程池任务

    定义全局线程池,将用户的请求放入自定义队列中,排队等候线程调用,等待超时则自动取消该任务,实现超时可取消的异步任务

    java线程池概念.txt

    线程池的排队策略与BlockingQueue有关。 threadFactory:线程工厂,主要用来创建线程:默认值 DefaultThreadFactory; handler:表示当拒绝处理任务时的策略,就是上面提及的reject操作;有以下四种取值:  ...

    Java多线程Queue、BlockingQueue和使用BlockingQueue实现生产消费者模型方法解析

    主要介绍了Java多线程Queue、BlockingQueue和使用BlockingQueue实现生产消费者模型方法解析,涉及queue,BlockingQueue等有关内容,具有一定参考价值,需要的朋友可以参考。

    线程池原理-ThreadPoolExecutor源码解析

    线程池原理-ThreadPoolExecutor源码解析 1.构造方法及参数 2.阻塞对列: BlockingQueue 3.线程工厂: DefaultThreadFactory 4.拒绝策略: RejectedExecutionHandler 5.执行线程 Executor

    这就是标题—— JUC.pdf

    JUC是什么 线程 进程 / 线程 ...BlockingQueue(阻塞队列) 线程池 池化技术 线程池的优势 线程池的特点 线程池三大方法 线程池七大参数 线程池四种拒绝策略 ForkJoin 异步回调 Volatile 指令重排 JMM

    第7章-JUC多线程v1.1.pdf

    CorePoolSize: 核心线程池大小, 如果核心线程池有空闲的位置, 新的任务就会被核心线程池新建一个线程执行, 执行完毕不会销毁线程, 线程会进入缓冲队列等待再次被运行 MaximunPoolSize: 线程池能创建最大的线程数量,...

    java并发包&线程池原理分析&锁的深度化

    并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。...列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue。

    高级开发并发面试题和答案.pdf

    面试高级开发的期间整理的面试题目,记录我面试遇到过的并发题目以及答案 目录 并发 常说的并发问题是哪些;资源竞争、死锁、事务、可见性 死锁 如何排查死锁; 产生死锁的必要条件: ...BlockingQueue

    java 多线程 生产者消费者模式源码

    java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...

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

    8)阻塞队列BlockingQueue 34 9)已完成任务队列CompletionService 36 10)计时器CountDownLatch 37 11)周期性同步工具CyclicBarrier 38 12)异步计算的结果Future 40 13)安排线程池ScheduledExecutorService 40 五多...

    阻塞队列、线程池和四大函数式接口.md

    java进阶部分

    Java NIO+多线程实现聊天室

    线程池ThreadPoolExecutor 阻塞队列BlockingQueue,生产者消费者模式 选择器 渠道 字节缓冲区 ProtoStuff 高性能序列化 HttpClient连接池 Spring依赖注入 lombok简化POJO开发 原子指标 内置锁 竣工服务 log4j+slf4j...

    Java多线程和并发知识整理

    一、理论基础 1.1为什么需要多线程 1.2不安全示例 1.3并发问题的根源 ...七、BlockingQueue 八、ConcurrentHashMap 九、CopyOnWriteArrayList 十、原子类-CAS, Unsafe和原子类详解 十一、JUC锁: LockSupport详解

    【2018最新最详细】并发多线程教程

    19.并发容器之BlockingQueue 20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 21.线程池ThreadPoolExecutor实现原理 22.线程池之ScheduledThreadPoolExecutor 23.FutureTask基本操作总结 24.Java...

    Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip

    - 线程池ThreadPoolExecutor - 阻塞队列BlockingQueue,生产者消费者模式 - Selector - Channel - ByteBuffer - ProtoStuff 高性能序列化 - HttpClient连接池 - Spring依赖注入 - lombok简化POJO开发 - ...

    java并发工具包详解

    2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 Synchronou sQueue 8. ...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞...

    Chat:Java NIO+多线程实现聊天室

    Java基于多线程和NIO实现聊天室涉及到的技术点线程池ThreadPoolExecutor阻塞队列BlockingQueue,生产者消费者模式SelectorChannelByteBufferProtoStuff 高性能序列化HttpClient连接池Spring依赖注入lombok简化POJO...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞...

Global site tag (gtag.js) - Google Analytics