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

java多线程Future和Callable用法

2014-04-06 19:25 417 查看
Java多线程搜索文件的代码示例,主要是使用Callable和Future,生成大量生命周期很短的线程,每个目录产生一个线程,可以使用一个线程池来运行任务,多个线程同时搜索文件,然后自动结束线程

package com.huawei.concurrent.thread;

import java.io.*;

import java.util.*;

import java.util.concurrent.*;

public class FileSearch implements Callable<List<File>>{

private File directory;

private FilenameFilter filter;

public FileSearch(File directory, FilenameFilter filter)

{

super();

this.directory = directory;

this.filter = filter;

}

@Override

public List<File> call() throws Exception {

List<File> list = new ArrayList<File>();

File[] files = directory.listFiles();

ArrayList<Future<List<File>>> results = new ArrayList<Future<List<File>>>();

for(File file : files)

{

if(file.isDirectory())

{

System.out.println("1111111111111:"+file.getParentFile()+"1111111111111111111111:"+file.getPath());

Callable<List<File>> runnable = new FileSearch(file,filter);

FutureTask<List<File>> task = new FutureTask<List<File>>(runnable);

results.add(task);

Thread t = new Thread(task);

t.start();

}

else if (filter.accept(file.getParentFile(), file.getName()))

{

System.out.println("父目录路径:"+file.getParentFile()+"包子:"+file.getPath());

list.add(file);

}

}

for (Future<List<File>> result : results) {

list.addAll(result.get());

}

return list;

}

public static void main(String[] args) throws Exception

{

File dir = new File("d:"+File.separator+"work"+File.separator+"test");

FileSearch search = new FileSearch(dir,new FilenameFilter()

{

@Override

public boolean accept(File dir, String name) {

return name.endsWith(".java");

}

});

FutureTask<List<File>> task = new FutureTask<List<File>>(search);

Thread t = new Thread(task);

t.start();

for(File f: task.get())

{

System.out.println(f.getPath());

System.out.println(f.getName());

}

}

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