Ste*_*wDK 1 java multithreading nullpointerexception
简介
我在弄清楚是什么导致我在HashMap中获得NullPointerException时遇到了一些困难,这应该是相当简单的.要理解为什么我使用HashMap,我认为描述它的最好方法是说我有一个多线程程序,它有一些我想要存储的结果.在那个上下文中,我创建了一个名为的类SaveMethod,用于存储进程中的值.因为我永远不知道哪个线程将首先完成,所以我使用a HashMap来i在这个hashmap中存储线程的值,如下所示:
代码:
首先是HashMap的定义:
// The first Integer element is the thread index, the second is the Double value
private static HashMap<Integer,Double> AUC = new HashMap<Integer,Double>();
Run Code Online (Sandbox Code Playgroud)
然后我调用这个方法,一个线程终止存储:
public static void setAUC(double AUC,int i){
Double AUCtemp = AUC;
SaveMethod.AUC.put(i,AUCtemp);
}
Run Code Online (Sandbox Code Playgroud)
更多描述:
现在,我已经通过以下方式成功实现了上述功能:
private static HashMap<Integer,Double[]> AUC = new HashMap<Integer,Double[]>();
Run Code Online (Sandbox Code Playgroud)
也就是说,与前面的例子相比,Double[]而不是Double.这非常有效.
问题
我的问题有两个:1)Exception in thread "main" java.lang.NullPointerException当我尝试调用此代码时,为什么会收到:
public static Double getAUC(int i){
double AUC = SaveMethod.AUC.get(i);
return AUC;
}
Run Code Online (Sandbox Code Playgroud)
2)这个保存选项线程安全吗?
一些额外的理由为什么我需要这个:
让我试着说明为什么我需要这个存储选项.我有一组需要执行的计算,比方说100.每次计算大约需要10秒钟.现在,为了减少计算时间,我实现了多线程,以便可以同时完成这些计算.但这些计算并不以任何方式相互依赖.但是,我需要为每个计算存储每个线程的每个结果(这是很多不同的值/矩阵等),以便可以从其他方法/类全局到达结果以用于绘图目的.您重新考虑的是如何存储计算结果并维护线程安全的环境?
1)为什么我在线程"main"中得到Exception
因为给定的整数可能没有值,所以get调用返回null.然后,您将取消装箱,这会引发异常.你的代码是有效的:
public static Double getAUC(int i){
Double temp = SaveMethod.AUC.get(i); // This can return null
double AUC = temp.doubleValue(); // This was auto-unboxing
Double boxed = Double.valueOf(AUC); // This was boxing
return boxed;
}
Run Code Online (Sandbox Code Playgroud)
如果您想要在null缺少密钥时返回,只需避免转换为Double.您的方法可以简单如下:
public static Double getAUC(int i) {
return SaveMethod.AUC.get(i);
}
Run Code Online (Sandbox Code Playgroud)
目前尚不清楚你是想要回归null,还是抛出其他一些例外.
2)这个保存选项线程安全吗?
好吧HashMap,开始时不是线程安全的,所以不...考虑使用ConcurrentHashMap.
| 归档时间: |
|
| 查看次数: |
673 次 |
| 最近记录: |