`

线程池小例

 
阅读更多
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线程池

    本例中采用抛出`RejectedExecutionException`的方式拒绝执行。 实现`execute`方法的具体逻辑如下: ```java @Override public void execute(Runnable command) { // 校验参数有效性 if (command == null) throw...

    java socket线程池

    在代码中,首先创建了一个ServerSocket对象,它监听特定端口(本例中为8000)。然后使用ExecutorService来管理线程池。线程池的大小是根据运行时可用的CPU数量乘以一个常数(POOL_SIZE)来确定的。通过调用Executors...

    android 线程池下载

    这里我们以`HttpURLConnection`为例,其基本步骤如下: 1. 创建`HttpURLConnection`对象并连接到服务器。 2. 设置请求方法(GET或POST)以及任何请求头。 3. 通过`setDoInput(true)`开启接收服务器数据。 4. 通过`...

    c++线程池pdf

    以给定的文件描述为例,涉及到的关键类包括: - **`CJob`**:所有任务的基类,提供`Run`接口供子类实现具体任务逻辑。 - **`CThread`**:封装了线程的基本属性和方法,是所有线程类的基类。 - **`CWorkerThread`**...

    用线程池解决服务器并发请求的方案设计

    为了更好地理解线程池的应用,以下以邮件服务器为例进行说明: 假设一个邮件服务器需要处理大量的收发邮件请求。在没有使用线程池的情况下,每接收到一个新的邮件请求,服务器就需要创建一个新的线程来处理该请求。...

    ThreadPool UML图

    以Java中的`ThreadPoolExecutor`类为例,它内部就使用了工作队列来管理待执行的任务。开发者可以通过调用`execute(Runnable command)`方法来向线程池提交任务,任务将被放入队列中等待空闲的工作线程取出执行。 ...

    MySQL线程池问题1

    Oracle和MariaDB都提供了线程池解决方案,其中Percona移植并优化了MariaDB的线程池功能,本文以Percona MySQL 5.7为例进行说明。 MySQL线程池的架构包含一个定时器线程和多个线程组,每个线程组有其工作线程、高低...

    线程池技术研究与应用.pdf

    以邮件发送为例,使用线程池管理邮件发送任务时,可以创建一个MailSenderPool类,该类中包含一个线程池,用于管理多个MailSender工作线程。每当需要发送邮件时,可以调用MailSenderPool类的addTask方法将邮件发送...

    liunx 通用线程池设计思想

    1. **定义任务结构体**:`taskNode`用于存储具体任务的数据结构,例如在本例中,`sockfd`字段用于存储网络连接的句柄。 2. **任务处理函数**:`printsd`函数用于处理具体任务,例如打印线程ID、socket句柄等信息。 3...

    线程池参考demo

    通过遍历线程列表,检查每个线程的空闲时间,如果超过一定阈值(本例中为100秒),则将该线程从线程池中移除。这有助于保持线程池的大小在一个合理的范围内,避免资源浪费。 ##### 任务队列与调度 `...

    Java四种线程池的简单介绍.docx

    - 第一个参数为线程池的大小(本例中为5)。 - 第二个参数为任务首次执行前的延迟时间。 - 第三个参数为后续执行的周期间隔。 - 第四个参数为时间单位。 - 这种线程池对于实现定时任务非常有用。 #### 4. `...

    Android异步加载图像小结 (含线程池,缓存方法).zip

    在实际项目中,"Android异步加载图像小结 (含线程池,缓存方法).doc"文档可能详细介绍了这些技术的实现细节和案例,而"项目说明.zip"可能包含了具体实现的代码示例,供开发者参考学习。 总的来说,高效地在...

    C++ 线程池实现原理1

    在本例中,`Add`方法就是用来添加任务的。 3. **任务调度**:当线程池中的某个线程可用时,它会从任务队列中取出一个任务执行。执行完毕后,线程会返回等待状态,直到新的任务到来。 4. **线程同步**:为了确保...

    Java代码构建一个线程池

    本例提供了一个非常基础的线程池实现,它能够有效地管理一组线程并分发任务给这些线程。虽然简单,但包含了线程池的基本概念和实现方式。实际项目中,通常会使用更高级的线程池实现如`Executors.newFixedThreadPool`...

    Python 应用之线程池.pdf

    文章通过一个运维工程师的工作场景为例,展示了Python线程池在实际应用中的优势。运维工程师可以管理数量庞大的操作系统、数据库和中间件,通过使用Python编写程序自动实现监控、故障处理、状态收集等任务。利用...

Global site tag (gtag.js) - Google Analytics