日期:2014-05-20  浏览次数:20627 次

能不能帮我分析下这两个程序的效率问题
想用用多线程
然后做了程序1 发现设计有点问题 阻塞在for循环了 这样就和不用多线程一样的效果
后来又改了2 把阻塞从for里拿出来 那样就可以形成多个线程去计数当前文件夹下的文件(当然要当前文件夹下的所有文件计数完毕才会返回上一级 程序一也一样...)
运行了下...发现时间消耗居然差不多 都在14s左右 就差个几十毫秒的样子.................
求解..
Java code
import java.io.File;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;


public class ListFileWithFutureTask {
    public static void main(String[] args) throws Exception {
        FutureTask<Integer> f=new FutureTask<Integer>(new Callable<Integer>(){
            public Integer call(){
                return search(new File("c:\\"));
            }
        });
        Date begin=new Date();
        f.run();
        System.out.println(f.get());
        Date end=new Date();
        System.out.println(begin.getTime()-end.getTime());

    }

    public static int search(File s){   //以下虽然产生了线程 但是效率还是一样低得可怕(线程等待...其实最多也就产生了一个 大错误....)
        final File[] ss=s.listFiles();
        int count=0;
        if(ss!=null){
        for(int i=0;i<ss.length;i++){
            if(ss[i].isDirectory()){
                final File sss=ss[i];                             //若是目录 则建新线程开始计数
                FutureTask<Integer> f=new FutureTask<Integer>(new Callable<Integer>(){
                    public Integer call(){
                        return search(sss); 
                    }
                });
                f.run();                   //这边会产生递归调用 但和单线程不同 这边的递归调用是多线的
                try {
                    count+=f.get();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }else{
                count++;                      //不是文件就计数
            }
        }
        }
        return count;
        
    }
}



Java code
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.io.File;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;


public class ListFileWithFutureTask2 {
    public static void main(String[] args) throws Exception {
        FutureTask<Integer> f=new FutureTask<Integer>(new Callable<Integer>(){
            public Integer call(){
                return search(new File("c:\\"));
            }
        });
        Date begin=new Date();
        f.run();
        System.out.println(f.get());
        Date end=new Date();
        System.out.println(begin.getTime()-end.getTime());

    }

    public static int search(File s){
        final File[] ss=s.listFiles();
        List<FutureTask<Integer>> fl=new ArrayList<FutureTask<Integer>>();
        int count=0;
        if(ss!=null){
        for(int i=0;i<ss.length;i++){
            if(ss[i].isDirectory()){
                final File sss=ss[i];                             //若是目录 则建新线程开始计数
                FutureTask<Integer> f=new FutureTask<Integer>(new Callable<Integer>(){
                    public Integer call(){
                        return search(sss); 
                    }
                });
                f.run();                   
                fl.add(f);
            }else{
                count++;                      
            }
        }
        for(FutureTask<Integer> i:fl){
            try {
                count=count+i.get();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        }
        return count;
        
    }
}