gpt4 book ai didi

java - 为什么在线程外访问时对象会变为 null

转载 作者:行者123 更新时间:2023-12-01 04:56:26 26 4
gpt4 key购买 nike

在下面的程序中我插入

files[i].lastModified() value in allFiles HashMap in RThread class

当我尝试从主类中的 allFiles HashMap 检索 lastModified 的值时,该值变为 null。因此,我没有将 LastModified 值直接放置在 HashMpa 中,而是将 File 对象直接放置在 HashMpa 中,然后它就起作用了。

任何人都可以指导我这背后的概念。

import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;

public class RCFLister {

ConcurrentHashMap allFiles = new ConcurrentHashMap();

String fileType = null;

/**
* @param args
*/
public static void main(String[] args) {
RCFLister rcFileLister = new RCFLister();
rcFileLister.recentFiles(args);
}

public void recentFiles(String[] args) {

int days = 1;
ThreadGroup rootthreadGr = new ThreadGroup("rootsThreadGroup");
// reading number of days
if (args.length > 0 && args[0] != null) {
days = Integer.valueOf(args[0]);
}
// reading file type
if (args.length > 0 && args[0] != null) {
fileType = args[1];
}
fileType = "png";
// fileextFilter = new FileExtensionFilter(fileType);
File[] roots = File.listRoots();
List threads = new ArrayList();
for (int i = 0; i < roots.length; i++) {
// System.out.println(roots[i].getAbsolutePath());
// rfThread = null;

RThread rfThread = new RThread(roots[i]);
Thread t = new Thread(rfThread);
t.start();
threads.add(t);
}

for (int i = 0; i < threads.size(); i++) {
try {
((Thread) threads.get(i)).join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

ValueComparator vc = new ValueComparator(allFiles);
TreeMap sortedMap = new TreeMap(vc);
sortedMap.putAll(allFiles);
System.out.println(sortedMap.size());
Iterator it = sortedMap.keySet().iterator();
while (it.hasNext()) {
Object key = it.next();
System.out.println(key + " " + sortedMap.get(key));
}
}

private class ValueComparator implements Comparator {

Map allFiles;

public ValueComparator(Map allFiles) {
this.allFiles = allFiles;
}

public int compare(Object o1, Object o2) {
if (((Long) allFiles.get(o1)) >= ((Long) allFiles.get(o2))) {
return -1;
} else {
return 1;
}
}
}

private class RThread implements Runnable {
File rootFolder;



RThread(File root) {
rootFolder = root;
}

public void run() {
getFiles(rootFolder);

}

public void getFiles(File folder) {
File[] files = folder.listFiles();
for (int i = 0; files != null && i < files.length; i++) {
// System.out.println(files[i].getAbsolutePath());
if (files[i].isDirectory()) {
getFiles(files[i]);
} else if (fileType == null
|| (fileType != null && files[i].getName().endsWith(
fileType))) {
String filename = null;
try {
filename = files[i].getCanonicalPath();
} catch (Exception e) {
e.printStackTrace();
}
if(files[i].lastModified()!=0)
allFiles.put(filename, files[i].lastModified());
}
}
}

}

}

最佳答案

ValueComparator 的compare() 方法永远不会返回0。返回0 表示缺少相等性,因此即使键存在,也找不到。另外,键是 String(filename) 并且您正在按值(长)进行比较。需要重新考虑如何存储数据。为了确保这只是问题,请打印 CocurrentHashMap。

一定要使用Generic,一开始看起来很乏味,但实际上并没有那么糟糕。它将有助于在没有警告的情况下编译代码并实现类型安全。

关于java - 为什么在线程外访问时对象会变为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14052569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com