バックグラウンドでいくつかのジョブを実行するプログラムを使用しています。アプリケーションを閉じる前に、残りのジョブが完了するのを待ってから実際に閉じる必要があるため、実行中のスレッドを格納する静的配列リストを使用してクラスを作成し、アプリのグローバル スコープからすべてのジョブにアクセスして取得できるようにしました。私が望んでいた結果。
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");
});
プログラムは、new Thread(){} への呼び出しがヌル ポインターであるかのように、':3' でコメント化された行でヌル ポインター例外をスローします >.>
PS: クラスを呼び出さずにその方法で新しい Thread 変数を作成し、その start() メソッドを呼び出すと、スレッドは意図したとおりに機能します。しかし、これらのスレッドをグローバルにアクセス可能なリストに格納する必要があるため、アプリを閉じる前にスレッドが終了するのを待つことができます。PS 2: 上記の関数名は代表的なものであり、アプリケーションで使用している名前ではありません。関数と型に長い名前を使用しません。
静的/非静的ルールのうち、考慮しなかったのはどれですか? xx