![](/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.