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++中,线程池可以帮助开发者更有效地管理和调度线程,从而提高程序的并发性能和...
如果添加成功,则添加其余的线程(本例中为 4 个)。然后线程池将工作项放入可用线程中。调用 eventX 上的 WaitOne 方法,这会使程序的其余部分等待,直到用 eventX.Set 方法触发事件为止。最后,程序打印出线程上的...
因为本人是个小白,多线程经常用,但是线程池并没有用过,(一听到线程池,总感觉高大上)。但是近期写彩票软件的时候发现,多线程长期操作会导致内容不断的升高直至报错,遂想起了线程池,完善后发现不是一般的叼...
本例中采用抛出`RejectedExecutionException`的方式拒绝执行。 实现`execute`方法的具体逻辑如下: ```java @Override public void execute(Runnable command) { // 校验参数有效性 if (command == null) throw...
在代码中,首先创建了一个ServerSocket对象,它监听特定端口(本例中为8000)。然后使用ExecutorService来管理线程池。线程池的大小是根据运行时可用的CPU数量乘以一个常数(POOL_SIZE)来确定的。通过调用Executors...
这里我们以`HttpURLConnection`为例,其基本步骤如下: 1. 创建`HttpURLConnection`对象并连接到服务器。 2. 设置请求方法(GET或POST)以及任何请求头。 3. 通过`setDoInput(true)`开启接收服务器数据。 4. 通过`...
以给定的文件描述为例,涉及到的关键类包括: - **`CJob`**:所有任务的基类,提供`Run`接口供子类实现具体任务逻辑。 - **`CThread`**:封装了线程的基本属性和方法,是所有线程类的基类。 - **`CWorkerThread`**...
为了更好地理解线程池的应用,以下以邮件服务器为例进行说明: 假设一个邮件服务器需要处理大量的收发邮件请求。在没有使用线程池的情况下,每接收到一个新的邮件请求,服务器就需要创建一个新的线程来处理该请求。...
以Java中的`ThreadPoolExecutor`类为例,它内部就使用了工作队列来管理待执行的任务。开发者可以通过调用`execute(Runnable command)`方法来向线程池提交任务,任务将被放入队列中等待空闲的工作线程取出执行。 ...
Oracle和MariaDB都提供了线程池解决方案,其中Percona移植并优化了MariaDB的线程池功能,本文以Percona MySQL 5.7为例进行说明。 MySQL线程池的架构包含一个定时器线程和多个线程组,每个线程组有其工作线程、高低...
以邮件发送为例,使用线程池管理邮件发送任务时,可以创建一个MailSenderPool类,该类中包含一个线程池,用于管理多个MailSender工作线程。每当需要发送邮件时,可以调用MailSenderPool类的addTask方法将邮件发送...
1. **定义任务结构体**:`taskNode`用于存储具体任务的数据结构,例如在本例中,`sockfd`字段用于存储网络连接的句柄。 2. **任务处理函数**:`printsd`函数用于处理具体任务,例如打印线程ID、socket句柄等信息。 3...
通过遍历线程列表,检查每个线程的空闲时间,如果超过一定阈值(本例中为100秒),则将该线程从线程池中移除。这有助于保持线程池的大小在一个合理的范围内,避免资源浪费。 ##### 任务队列与调度 `...
- 第一个参数为线程池的大小(本例中为5)。 - 第二个参数为任务首次执行前的延迟时间。 - 第三个参数为后续执行的周期间隔。 - 第四个参数为时间单位。 - 这种线程池对于实现定时任务非常有用。 #### 4. `...
在实际项目中,"Android异步加载图像小结 (含线程池,缓存方法).doc"文档可能详细介绍了这些技术的实现细节和案例,而"项目说明.zip"可能包含了具体实现的代码示例,供开发者参考学习。 总的来说,高效地在...
在本例中,`Add`方法就是用来添加任务的。 3. **任务调度**:当线程池中的某个线程可用时,它会从任务队列中取出一个任务执行。执行完毕后,线程会返回等待状态,直到新的任务到来。 4. **线程同步**:为了确保...
本例提供了一个非常基础的线程池实现,它能够有效地管理一组线程并分发任务给这些线程。虽然简单,但包含了线程池的基本概念和实现方式。实际项目中,通常会使用更高级的线程池实现如`Executors.newFixedThreadPool`...
文章通过一个运维工程师的工作场景为例,展示了Python线程池在实际应用中的优势。运维工程师可以管理数量庞大的操作系统、数据库和中间件,通过使用Python编写程序自动实现监控、故障处理、状态收集等任务。利用...