![](/img/trans.png)
[英]Main not waiting for threads even after using Thread.join() in Java
[英]NullPointer Exception using Thread.join on multiple threads
我的一个Java程序出现以下问题。 我正在尝试启动多个线程,具体取决于我的主程序在文件系统上找到的内容。 它的工作方式非常经典:-第一个循环:实例化,存储在本地数组中并启动新线程-第二个循环:使用'.join()'方法等待所有线程
执行时,我在'.join()'上得到了一个NullPointerException。 此异常由启动的第三个线程引发(因为它在第2个线程之前完成)
这是我的代码的示例:
PackageManager[] myRootManagers = new PackageManager[myCCDirs.size()];
int i = 0;
for (PkgDescriptor descriptor : myCCDirs) {
...
// --- instantiate new ROOT manager
myRootManagers[i] = new PackageManager(getConfig(), loggerPac, descriptor);
// --- start it
myRootManagers[i].start();
}
for (PackageManager packageManager : myRootManagers) {
try {
packageManager.join();
}
catch (InterruptedException e) {
loggerPac.error("...");
}
}
有人知道为什么会发生这种异常吗?
确保第一个循环中的所有i
都覆盖myRootManagers
数组中的所有有效指标。
请注意,您应该在第一个for循环的末尾增加i
,因为数组索引基于0。
int i = 0;
for (PkgDescriptor descriptor : myCCDirs) {
...
// --- instantiate new ROOT manager
myRootManagers[i] = new PackageManager(getConfig(), loggerPac, descriptor);
// --- start it
myRootManagers[i].start();
i++; // <-----------------------------------
}
作为调试步骤,我将添加
System.out.println(Arrays.toString(myRootManagers));
在第一个循环之后,断言没有null
引用。
除非您隐藏了重要部分,否则这对我来说似乎很奇怪:
for (PkgDescriptor descriptor : myCCDirs) {
...
// --- instantiate new ROOT manager
myRootManagers[i] = new PackageManager(getConfig(), loggerPac, descriptor);
// --- start it
myRootManagers[i].start();
}
您遍历myCCDirs
但初始化了myRootManagers
对象,也许您没有增加i
?
如果在另一个线程中删除了myCCDirs,也会发生这种情况。
PackageManager[] myRootManagers = new PackageManager[myCCDirs.size()]; // size is 3
int i = 0;
for (PkgDescriptor descriptor : myCCDirs) { // size is now 2 so the last field is not set.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.