求救各位大神:
public static void threadTestAll(String dirName) {
long start = System.currentTimeMillis();
ExecutorService pool = Executors.newFixedThreadPool(30);
List<Callable<String>> tasks = new ArrayList<Callable<String>>();
File dir = new File(dirName);
for(File f:dir.listFiles(new myFilter())){
myTask t = new ThreadTest2().new myTask(f.getAbsolutePath());
tasks.add(t);
}
try {
List<Future<String>> r = pool.invokeAll(tasks);
for (Future<String> f : r)
{
if(f != null){
System.out.println(f);
System.out.println("task result=" + f.get());
}
}
pool.shutdown();
long end = System.currentTimeMillis();
System.out.println("测试用了"+(end-start)+"毫秒");
} catch (Exception e) {
System.out.println("here");
e.printStackTrace();
}
}
class myTask implements Callable<String> {
final String fileName;
public myTask(String fileName) {
this.fileName = fileName;
}
@Override
public String call() throws Exception {
System.out.println("线程开始查找"+fileName);
List<String> l = FileUtils.serachFileNames(fileName, "[七七电视www.77ds.com]蚁人TS清晰中字.mp4", false);
if(l.size() != 0){
// System.out.println(l.get(0));
System.out.println(l.get(0));
return l.get(0);
}
return "";
// throw new Exception("没找到");
}
}
我的两段代码,没有发现任何有空指针异常的情况,单步调试也不知道哪出问题了,在这里 System.out.println(f);
System.out.println("task result=" + f.get()); 打印也可以把对象打印出来,但不知道为啥,总有一个对象get的时候出错了,报空指针问题,求大神指教 这是结果
线程开始查找d:\$RECYCLE.BIN
线程开始查找d:\7450
线程开始查找d:\android
线程开始查找d:\360WiFi
线程开始查找d:\cha
线程开始查找d:\360Downloads
线程开始查找d:\maven
线程开始查找d:\opt
线程开始查找d:\Program Files (x86)
线程开始查找d:\DOWNLOAD
线程开始查找d:\RJ
线程开始查找d:\updateEdb
线程开始查找d:\work
线程开始查找d:\program
线程开始查找d:\kinggsoft
线程开始查找d:\Program Files
线程开始查找d:\迅雷下载
线程开始查找d:\shuju
线程开始查找d:\Youku Files
线程开始查找d:\System Volume Information
线程开始查找d:\备份
d:\迅雷下载\新建文件夹\[七七电视www.77ds.com]蚁人TS清晰中字.mp4
java.util.concurrent.FutureTask@6ef0eed6
task result=
java.util.concurrent.FutureTask@bd05c81
task result=
java.util.concurrent.FutureTask@1c691f36
task result=
java.util.concurrent.FutureTask@398020cc
task result=
java.util.concurrent.FutureTask@ae94e92
task result=
java.util.concurrent.FutureTask@5b2558d6
task result=
java.util.concurrent.FutureTask@70eb7859
task result=
java.util.concurrent.FutureTask@732a54f9
task result=
java.util.concurrent.FutureTask@6030e280
task result=
java.util.concurrent.FutureTask@296672d6
task result=
java.util.concurrent.FutureTask@4fd54d6
task result=
java.util.concurrent.FutureTask@13ccb029
task result=
java.util.concurrent.FutureTask@63415de6
task result=
java.util.concurrent.FutureTask@587bd9f2
task result=
java.util.concurrent.FutureTask@2b21cc40
task result=
java.util.concurrent.FutureTask@37e893df
here
java.util.concurrent.ExecutionException: java.lang.NullPointerException
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
at codeTest.ThreadTest2.threadTestAll(ThreadTest2.java:48)
at codeTest.ThreadTest2.main(ThreadTest2.java:30)
Caused by: java.lang.NullPointerException
at codeTest.ThreadTest2$myTask.call(ThreadTest2.java:91)
at codeTest.ThreadTest2$myTask.call(ThreadTest2.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)