Java线程池——FutureTask
2016-05-02 22:47
441 查看
* *FutureTask(一般传递一个Callable参数)可以在Future和Runnable中间转换,在线程想要得到一个结果的时候,使用FutureTask非常方便。**
下面的程序是寻找文件file中每一行包含的关键字key的个数。
执行结果
下面的程序是寻找文件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; } }
执行结果
相关文章推荐
- struts2入门到精通教程
- 适配器模式
- Java之Volatile关键字使用
- JSON格式数据解析(Java版)
- java连接mysql时用到的参数
- Java学习(十)
- SpringData 学习(7)—— 学习 Repository 接口的第 2 个子接口 PagingAndSortingRepository
- java利用classloader实现热部署
- java发送邮件
- Springboot+Maven多模块开发 (一)初始化工程(新建第一个web工程)
- java正则表达式去掉标点符号
- java锁的种类以及辨析
- java--XML概述
- HDU 1042 N! -- 求阶乘 java大法好
- HDU 1753 大明A+B -- java大法好
- HDU 1002 A + B Problem II -- java大法好
- Java中List和ArrayList的区别(加入了个人见解)
- 我爱学Java之Thread中stop(),suspend(),resume()为什么不安全
- 第59课:使用Java实战RDD和DataFrame转换操作
- jdbc的使用