我正在使用一个应该在后台运行一些作业的程序。在应用程序关闭之前,它应该在实际关闭之前等待剩余的作业完成,所以我用一个静态数组列表创建了一个类来存储正在运行的线程,这样我就可以从我的应用程序的全局范围内访问所有这些作业并获得我想要的结果。
public class BackgroundWorker extends javax.swing.JDialog {
private static ArrayList thlist;
public static void DoThisThingAndDontBotherMe(Thread t) {
thlist.add(t); // :3
t.start();
}
public static void WaitForJobsToBeDone() {
for(Object o : thlist.toArray()) {
if(!((Thread) o).isAlive()) {
thlist.remove(o);
}
}
if(thlist.isEmpty())
return;
for(int i = 0; i < thlist.size(); i++) {
try {
((Thread) thlist.get(i)).join();
} catch(InterruptedException e) { System.err.println("Crap. A thread failed!! X.x");
}
}
}
...但是当我从外部类调用它时,像这样:
BackgroundWorker.DoThisThingAndDontBotherMe(new Thread() {
System.out.println("HEY, im a creepy thread! But ill soon cause this program to throw a NullPointerExeption. And the lame programmer won't know why >:D");
});
程序在用 ':3' 注释的行中抛出一个空指针异常,就好像对 new Thread(){} 的调用是一个空指针 >.>
PS:如果我确实以这种方式创建了一个新的 Thread 变量,而不调用我的类然后调用它的 start() 方法,那么线程会按预期完成它的工作。但是我需要将这些线程存储在一个全局可访问的列表中,这样我就可以等待它完成,然后才能关闭我的应用程序。PS 2:上面的函数名称只是代表,并不是我在我的应用程序中使用的名称。我不对函数和类型使用长名称。
我没有考虑哪些静态/非静态规则?xx