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;
}
}
}
分享到:
相关推荐
本项目实现了利用线程池进行目录拷贝的功能,这涉及到多个重要的编程概念和技术,包括线程池的创建与管理、目录遍历、文件I/O操作以及并发控制。 首先,线程池是通过预先创建一组线程来实现的,这些线程在空闲时...
【标题】"火山安卓编程线程池例子"主要聚焦于Android平台上的多线程编程,尤其是使用火山编程框架实现线程池的示例。在Android应用开发中,线程池是一种有效的管理并发任务的方式,它可以帮助优化系统资源的使用,...
下面我们将深入探讨线程池的概念、其工作原理,以及如何应用于文件操作,特别是文件目录的拷贝。 1. **线程池概念**: 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些...
`pthread_pool.cpp`文件则可能包含了线程池类的实现细节,例如如何初始化线程池、如何启动和停止工作线程、如何管理任务队列等。在Linux环境下,线程池通常基于POSIX线程库(pthread)实现,所以`pthread_create`、`...
在提供的压缩包文件中,"threadpooldemosrc.rar"可能包含线程池实现的源代码示例,"ThreadPool的实现.rar"可能有详细的线程池实现步骤和代码,"threadmanage.rar"和"thread_manager.zip"可能涉及线程管理和控制的...
利用线程池实现拷贝目录的效果,让其效果等同于cp命令。
在提供的压缩包文件"ThreadPool_src"中,可能包含了一个简单的线程池实现的源代码。通过查看和分析这个源代码,我们可以学习到线程池的具体实现细节,如如何创建线程、如何管理任务队列、如何调度任务以及如何控制...
在"threadpool"和"common"这两个文件夹中,可能包含了实现这些类的源代码文件,以及可能用于支持线程池运行的通用工具类或辅助函数。"threadpool"可能包含了线程池相关的类和接口实现,而"common"可能包含了一些常用...
通过调用`start()`方法,我们可以将任务(一个实现了Runnable接口的对象)提交到线程池,线程池会根据需要自动启动新的线程或者复用已存在的线程来执行任务。 **创建自定义任务类** 在Qt中,我们可以自定义一个继承...
这个“C++简单线程池例子”提供了实现线程池的一个实例,通过分析`TestMyThreadPool.cpp`文件,我们可以学习如何设计和使用线程池。 1. **线程池概念**:线程池是由一组预先创建的线程组成的,这些线程等待接收任务...
1. 源代码文件(如main.cpp):这是程序的入口点,通常会包含QApplication的实例化和主循环,以及线程池的初始化和任务的提交。 2. 头文件(如threadpool.h):可能定义了自定义的QRunnable子类,用于实现特定的任务...
基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池...
### 线程池原理及创建(C++实现) #### 一、线程池的重要性 在现代计算环境中,网络服务器面临着处理大量并发请求的挑战,其中包括但不限于Web服务器、电子邮件服务器和数据库服务器。这类服务器通常需要在短时间...
下面是一个简单的Fork/Join框架的例子,假设我们要计算一个数组的累加和: ```java import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveAction; public class SumCalculator ...
线程池是现代操作系统中一个重要的并发编程概念,它在Windows操作系统中被广泛使用,以提高系统资源的利用率和性能。线程池是由操作系统维护的一组预创建的线程,这些线程可供多个任务共享,而不是为每个任务创建新...
在Windows环境下,Visual C++(VC++)提供了多种方式来实现线程池,其中包括使用Microsoft的 ConcRT(Concurrent Runtime)库和自定义实现。这个“threadpooldemosrc.rar”压缩包中的示例代码可能是为了演示如何在...
Java 线程池例子 ThreadPoolExecutor Java 中的线程池是指一个容器,里面包含了多个线程,这些线程可以重复使用,以避免频繁创建和销毁线程的开销。ThreadPoolExecutor 是 Java 中一个非常重要的线程池实现类,它...
在C++中实现线程池,可以有效地管理和调度线程资源,避免频繁创建和销毁线程带来的开销。线程池的核心概念是任务队列,其中包含待处理的任务,而线程池中的工作线程会从队列中取出任务并执行。 在"C++线程池的实现...
java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java...
易语言简易线程池的实现。 ——V雪落有声V原创。转载请保留。前文:。为了能充分理解本篇文章的内容,需要了解的知识如下:。1.事件对象的使用:http://baike.baidu.com/view/751499.htm。2.信号量的使用:...