package threadpooltest;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
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;
/**
*
* @author Administrator
*/
public class ThreadPoolTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Scanner in = new Scanner(System.in);
System.out.print("Enter base directory (e.g. /usr/local/jdk5.0/src) :");
String directory = in.nextLine();
System.out.print("Enter keyword (e.g. volatile)");
String keyword = in.nextLine();
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(ExecutionException e)
{
e.printStackTrace();
}
catch(InterruptedException e)
{
}
pool.shutdown();
int largestPoolSize = ((ThreadPoolExecutor) pool).getLargestPoolSize();
System.out.println("largest pool size= " + largestPoolSize);
}
}
/*
* MatchCounter类实现了call方法。该方法查找指定目录下的文件及子目录。如果文件包含关键字则count++.
* 如果是目录则递归将执行结果存入类型为Feture<Integer>的ArrayList数组。最后将count的值加上递归得
* 到的值。算出指定目录下面包含关键字的文件的数目。
*/
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;
}
@Override
public Integer call()
{
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(ExecutionException e)
{
}
}
}
catch(InterruptedException e)
{
}
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(IOException e)
{
return false;
}
}
}
分享到:
相关推荐
这是一个简单线程池的实现,虽然有很多bug,但是能够简单地实现线程池。
该程序实现了使用线程池实现文件目录的拷贝,其中含有完整的make脚本程序,可执行文件
利用线程池实现拷贝目录的效果,让其效果等同于cp命令。
实现了Linux线程池目录拷贝的功能,包含了线程池,目录检索,文件IO操作,供学习使用。
一个简单的线程池例子;
基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池...
Windows自带的线程池的实现
VC实现的线程池例程,深入地讲解操作系统实现的线程池的优越性,尝试实现一个简单的线程池模型。
易语言简易线程池的实现。 ——V雪落有声V原创。转载请保留。前文:。为了能充分理解本篇文章的内容,需要了解的知识如下:。1.事件对象的使用:http://baike.baidu.com/view/751499.htm。2.信号量的使用:...
java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java...
火山编程_线程例子 需要的同学阔以下载哦!来自_利快云(@火山_仰望)提供 .......
参考了ACE线程池机制实现的线程池,封装了工作者类CWorker,任务类CTask,线程调度类CManager,线程池类CThreadPool
自已用Qt写的线程池实现程序,可以正常运行,用socket进行通讯,很适合初学者学习借鉴;
这是一个很简单的线程池实现 适合刚开始研究线程池的朋友
linux线程池创建c实现 linux线程池创建c实现 linux线程池创建c实现 linux线程池创建c实现 linux线程池创建c实现 linux线程池创建c实现
线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池...
线程池原理及创建(C++实现)线程池原理及创建(C++实现)线程池原理及创建(C++实现)线程池原理及创建(C++实现)
一个关于java 线程池的例子,也适合android
这是一个使用c++实现的线程池的源代码,在WIN以及UNIX环境下都可以使用
线程池例子线程池例子线程池例子线程池例子