BlockingQueue+线程池

A.使用阻塞队列存储任务:Runnable,Callable,FutureTask

B.线程池从队列取任务执行:put(),take()

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
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;

public class MatchCounter implements Callable<Integer> {
	
	public static void main(String[] args) {
		File directory = new File("D:\\project\\sis\\branches\\uat\\play\\test");
		String keyword = "class";
		
		//线程池
		ExecutorService pool = Executors.newCachedThreadPool();
		
		MatchCounter counter = new MatchCounter(directory, keyword, pool);
		Future<Integer> result = pool.submit(counter);
		
		try {
			System.out.println(result.get());
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {}
		
		pool.shutdown();
		
		//获取线程池同时存在线程的峰值
		ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)pool;
		int largest = threadPoolExecutor.getLargestPoolSize();
		System.out.println("largest pool size = " + largest);
	}
	
	public MatchCounter(File directory, String keyword, ExecutorService threadPool) {
		this.searchDir = directory;
		this.keyword = keyword;
		this.pool = threadPool;
		this.count = 0;
	}

	@Override
	public Integer call() throws Exception {
		ArrayList<Future<Integer>> resultList = new ArrayList<>();//保存结果集
		for(File file : searchDir.listFiles()){
			if(file.isDirectory()) {
				MatchCounter counter = new MatchCounter(file, keyword, pool);
				Future<Integer> result = pool.submit(counter);//提交新的任务
				resultList.add(result);
			} else {
				if(search(file))
					count++;
			}
		}
		for(Future<Integer> result : resultList) {
			count += result.get();//递归
		}
		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 (FileNotFoundException e1) {
			return false;
		}
	}

	private int count;
	private File searchDir;
	private String keyword;
	private ExecutorService pool;
}

猜你喜欢

转载自just2learn.iteye.com/blog/2101754