`

线程池小例

 
阅读更多
package com.test.current;

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

public class ThreadPoolTest {
	public static void main(String[] args) {
		//指定目录和关键字  
        String directory = "C:\\Program Files\\Java\\jdk1.6.0_29";  
        String keyword = "volatile";  
        
		ExecutorService pool = Executors.newCachedThreadPool();
		MatchCounter counter = new MatchCounter(new File(directory), keyword, pool);
		Future<Integer> result = pool.submit(counter);
		try{
			System.out.println(result.get()+" matching files");
		}catch (Exception e) {
			e.printStackTrace();
		}
		pool.shutdown();
		int largestPoolSize = ((ThreadPoolExecutor)pool).getLargestPoolSize();
		System.out.println("largest pool size="+largestPoolSize);
	}
}
class MatchCounter implements Callable<Integer>{
	private File directory;
	private String keyword;
	private ExecutorService pool;
	private int count;
	
	public MatchCounter(File directory, String keyword, ExecutorService pool) {
		this.directory = directory;
		this.keyword = keyword;
		this.pool = pool;
	}
	public Integer call() throws Exception {
		count =0;
		try{
			File[] files = directory.listFiles();
			ArrayList<Future<Integer>> results = new ArrayList<Future<Integer>>();
			for (File file : files) {
				if(file.isDirectory()){
					MatchCounter counter = new MatchCounter(file, keyword, pool);
					Future<Integer> result = pool.submit(counter);
					results.add(result);
				}else{
					if(search(file)){
						count ++;
					}
				}
				
				for (Future<Integer> result : results) {
					try{
						count += result.get();
					}catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		}catch (Exception e) {
		}
		return count;
	}
	public 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(Exception e){
			e.printStackTrace();
			return false;
		}
	}
分享到:
评论

相关推荐

    vc++线程池的经典实例

    vc++线程池的经典实例,不可多得,觉得经典

    如何使用线程池

    如果添加成功,则添加其余的线程(本例中为 4 个)。然后线程池将工作项放入可用线程中。调用 eventX 上的 WaitOne 方法,这会使程序的其余部分等待,直到用 eventX.Set 方法触发事件为止。最后,程序打印出线程上的...

    易语言线程池操作例程(解决内存不断升高的问题)

     因为本人是个小白,多线程经常用,但是线程池并没有用过,(一听到线程池,总感觉高大上)。但是近期写彩票软件的时候发现,多线程长期操作会导致内容不断的升高直至报错,遂想起了线程池,完善后发现不是一般的叼...

    java线程池&子线程&事务&异步返回监听实战

    往往会遇到一个请求需要处理很多次数据库,想要分成多个线程异步处理,在此给出个一个试例完成上述需求,子事务的成败会控制主线程的事务,并利用了CompletableFuture实现异步监听,@Async注解实现了线程池的应用。

    03丨线程池:业务代码最常用也最容易犯错的组件

    Java 业务开发常见错误 100 例 代码篇 03丨线程池:业务代码最常用也最容易犯错的组件

    并发容器和线程池,java并发编程3

    构如下所示:在⼤多数的应⽤场景中,读操作的⽐例远远⼤于写操作。那么,当执⾏读操作的时候,对数据是没 有修改的,所以,⽆须对数据进⾏加锁操作。⽽针对于写操作的场景中,则需要加锁来保证数据的 正确性。 ● ⽽...

    piscina:一种快速,高效的Node.js Worker线程池实现

    piscina-node.js工作池 :check_mark: 线程之间的快速通信 :check_mark: 涵盖固定任务和可变任务方案 :check_mark: 支持灵活的池大小 ...例 在main.js : const Piscina = require ( 'piscina' ) ; const piscina =

    Spring Boot如何优雅的使用多线程实例详解

    主要给大家介绍了关于Spring Boot如何优雅的使用多线程的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    python如何控制进程或者线程的个数

    方法一:进程池/线程池 如下例demo所示, 创建了一个大小是4的进程池,然后创建5个进程,并启动 from multiprocessing import Pool import os, time, random def long_time_task(name): print('Run task %s (%s)....

    易语言-基于libcurl的异步单线程高并发http模型

    最近在工作中用到了libcurl请求大量网页,感觉使用多线程的方式线程数太高的话会影响性能...今天抽空写了两个小demo,也一并发出来了。这个异步框架和平常使用的同步请求思路上有些不同,具体有哪些不同,可以看源码。

    Thrift的服务器和客户端Python案例

    服务器 Thrift提供的常见服务端类型有一下几种: thrift.server.TServer....我们以线程池服务器为例,其他方式相同。 import sys sys.path.append('gen-py') # 增加生成代码的查找包路径 from calculate im

    吉林大学软件学院卓班设计模式第一次作业

    吉林大学软件学院卓班设计模式第一次作业 一. 使用分类稳定和变化的方法,重新设计类,使得新设计能以扩展代码的方式适应变化 未来可能会增加新的数据成员如mVal3, do1和do2...请用多例模式设计线程池类(ThreadPool)

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例143 使用线程池优化多线程编程 186 实例144 Object类中线程相关的方法 187 实例145 哲学家就餐问题 189 实例146 使用信号量实现线程同步 190 实例147 使用原子变量实现线程同步 191 实例148 使用事件分配线程...

    Java NIO+多线程实现聊天室

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

    java微信公众号MVC开发框架

    提供线程池执行微信方法,方法调用线程池大小可配置 长任务消息推送 通过微信上下文配置支持多个微信公众号处理 提供统一的异常处理机制 提供access_token自动更新机制 请求消息组装 灵活的响应消息类型 二、快速...

    C#线程参考手册

    书自上而下地介绍了.NET执行C#代码的方法。首先描述了Windows线程的定义,它们与.NET进程、...本书还介绍了多线程应用程序使用的一些典型的体系结构,尤其是线程池,并阐述了如何调试多线程代码。最后用一个完整的例

Global site tag (gtag.js) - Google Analytics