ExecutorService用法
2013-11-14 21:58
375 查看
在给定的某个文件夹下查找给定的关键字keywords
程序源于Java核心技术(卷I)第8版 基础知识(中文版)
作者:Cay S.Horstmann,Gray Cornell ,
第14章多线程中的第14.9节 执行器,源码如下:
运行结果:
Enter base directory (e.g. /usr/local/jdk5.0/src): D:\all_install\MyEclipse_install\Workspace1\tesst\src\v1ch14
Enter keyword (e.g. volatile): public
21 matching files.
largest pool size=12
程序源于Java核心技术(卷I)第8版 基础知识(中文版)
作者:Cay S.Horstmann,Gray Cornell ,
第14章多线程中的第14.9节 执行器,源码如下:
package v1ch14.ThreadPoolTest; import java.io.*; import java.util.*; import java.util.concurrent.*; /** * @version 1.0 2004-08-01 * @author Cay Horstmann */ public class ThreadPoolTest { public static void main(String[] args) throws Exception { 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); } } /** * This task counts the files in a directory and its subdirectories that contain a given keyword. */ class MatchCounter implements Callable<Integer> { /** * Constructs a MatchCounter. * @param directory the directory in which to start the search * @param keyword the keyword to look for * @param pool the thread pool for submitting subtasks */ public MatchCounter(File directory, String keyword, ExecutorService pool) { this.directory = directory; this.keyword = keyword; this.pool = pool; } 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) { e.printStackTrace(); } } catch (InterruptedException e) { } return count; } /** * Searches a file for a given keyword. * @param file the file to search * @return true if the keyword is contained in the file */ 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 (IOException e) { return false; } } private File directory; private String keyword; private ExecutorService pool; private int count; }
运行结果:
Enter base directory (e.g. /usr/local/jdk5.0/src): D:\all_install\MyEclipse_install\Workspace1\tesst\src\v1ch14
Enter keyword (e.g. volatile): public
21 matching files.
largest pool size=12
相关文章推荐
- ExecutorService中submit和execute的区别、Callable 的用法
- ScheduledExecutorService的用法
- ExecutorCompletionService用法示例
- ExecutorService线程池的用法
- Callable和futrue、ExecutorService的用法
- ScheduledExecutorService的用法
- ExecutorService线程池的用法
- ScheduledExecutorService用法
- ExecutorService线程池的用法
- 关于ExecutorService 的用法
- ExecutorService线程池的用法
- ExecutorService线程池的用法
- 通过代码,解释ExecutorService基本用法
- CompletionService 和ExecutorService的区别和用法
- ScheduledExecutorService的用法——定时执行两个任务
- java中 ExecutorService,Executor,ThreadPoolExecutor的用法
- ScheduleExecutorService用法
- ExecutorService线程池的用法
- CompletionService 和ExecutorService的区别和用法
- ScheduledExecutorService 定时器用法