Mega Code Archive

 
Categories / Java / Threads
 

Java util concurrent ThreadPoolExecutor and thread pool

/*  This program is a part of the companion code for Core Java 8th ed.  (http://horstmann.com/corejava)  This program is free software: you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation, either version 3 of the License, or  (at your option) any later version.  This program is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License for more details.  You should have received a copy of the GNU General Public License  along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ 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; /**  * @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; }