以下のコードでスレッドリークの理由を見つけるのを手伝ってください。TestThread
run()が完了し(コンソール印刷ステートメントから確認)、mainメソッドが終了した(印刷ステートメントとプロファイラーツールから確認)後でも、はガベージコレクションを取得しません。
ただし、TestThread
デーモンスレッドとして設定されている場合、ガベージコレクションが行われt.setDaemon(true)
ます。以下のコードは、私のアプリケーションの問題を説明するサンプルコードです。既存のスケジューリングクラス(他の誰かが使用して設計したものScheduledExecutorService
)を使用しようとしています。Runnable
クラスで複数のをスケジュールし続けると、作成されたスレッドがガベージコレクションされないことに気付きました。
public class ThreadTest {
static void runThreadWithExecutor() {
final String name = "TestThread";
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, name);
t.setDaemon(false);
return t;
}
});
ses.schedule(new Runnable() {
@Override
public void run() {
System.out.println("entered " + name);
System.out.println("exiting " + name);
}},
2,
TimeUnit.SECONDS);
}
public static void main(String[] args) throws InterruptedException {
System.out.println("entered main");
runThreadWithExecutor();
Thread.sleep(5000);
System.out.println("exiting main");
}
}