您的位置:首页 > 编程语言 > Java开发

Java线程池——FutureTask

2016-05-02 22:47 441 查看
* *FutureTask(一般传递一个Callable参数)可以在Future和Runnable中间转换,在线程想要得到一个结果的时候,使用FutureTask非常方便。**

下面的程序是寻找文件file中每一行包含的关键字key的个数。

package demo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ThreadPoolExecutor;

public class FutureState {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file=new File("e://java.test");
ThreadPoolExecutor poolExecutor=(ThreadPoolExecutor)Executors.newCachedThreadPool();
MatchCallable mCallable=new MatchCallable(file, "wp",poolExecutor);
FutureTask<Integer> f=new FutureTask<Integer>(mCallable);
poolExecutor.submit(f);
//new Thread(f).start();
try {
System.out.println(f.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

class MatchCallable implements Callable<Integer>{
private String key;
private File file;
private Integer result=0;
ThreadPoolExecutor pool;
public MatchCallable(File file,String key,ThreadPoolExecutor pool) {
this.file=file;
this.key=key;
this.pool=pool;
}
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
File[] files=file.listFiles();
//存储各个线程返回的Future结果
ArrayList<Future> results=new ArrayList<Future>();
for(File fileItem:files){
//处理是目录的文件
if(fileItem.isDirectory()){
MatchCallable matchCallable=new MatchCallable(fileItem, key,pool);
FutureTask<Integer> futureTask=new FutureTask<Integer>(matchCallable);
pool.submit(futureTask);
results.add(futureTask);
//Thread thread=new Thread(futureTask);
//thread.start();
for(Future future:results){
Integer r=(Integer)future.get();
result+=r;
}
}
//处理普通文件
else{
result+=search(fileItem, key);
}
}
return result;
}
//匹配文件file中的关键字key
public Integer search(File file,String key){
Integer result=0;
try {
FileReader fileReader=new FileReader(file);
BufferedReader bufferedReader=new BufferedReader(fileReader);
String lineString=bufferedReader.readLine();
while(lineString!=null){
if(lineString.contains(key)){
result++;
}
lineString=bufferedReader.readLine();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}


执行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: