Future使用小例

package com.test.current;

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.Future;
import java.util.concurrent.FutureTask;

public class FutureTest {
	public static void main(String[] args) {
		//指定目录和关键字
		String directory = "C:\\Program Files\\Java\\jdk1.6.0_29";
		String keyword = "volatile";
		MatchCounter counter = new MatchCounter(new File(directory),keyword);
		FutureTask<Integer> task = new FutureTask<Integer>(counter);
		Thread t = new Thread(task);
		t.start();
		try{
			System.out.println(task.get() + "matching files");
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}
//这个线程用户向队列中添加文件
class MatchCounter implements Callable<Integer>{
	private File directory;
	private String keyword;
	private int count;
	public static File DUMMY = new File("");//这个文件作为一个结束标记
	
	public MatchCounter(File directory,String keyword){
		this.directory = directory;
		this.keyword = keyword;
	}
	
	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);
					FutureTask<Integer> task = new FutureTask<Integer>(counter);
					results.add(task);
					Thread t = new Thread(task);
					t.start();
				}else{
					if(search(file)){
						count++;
					}
				}
			}
			for(Future<Integer> result:results){
				try{
					count += result.get();
				}catch (Exception e) {
					e.printStackTrace();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		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 (IOException e) {
			return false;
		}
	}
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值