ローカルのtmpディレクトリに保存された一連の一時ファイルを作成する単純なJavaプログラムがあります。プログラムを終了する前に、すべてのファイルをウォークスルーして削除し、次にtmpディレクトリを削除する単純なシャットダウンフックを追加しました。コードは次のとおりです。
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
File tmpDir = new File("tmp/");
for (File f : tmpDir.listFiles()) {
f.delete();
}
tmpDir.delete();
}
}));
listFiles()
私の問題は、これらのファイルを作成するスレッドがシャットダウンフックの起動時に終了していない可能性があるため、が呼び出された後に作成されたファイルがある可能性があることです。これにより、tmpディレクトリは削除されません。私はこれについて2つのハックを思いついた:
ハック#1:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
File tmpDir = new File("tmp/");
while (!tmp.delete()){
for (File f : tmpDir.listFiles()) {
f.delete();
}
}
}
}));
ハック#2:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(1000);
} catch(InterruptedException e){
e.printStackTrace();
}
File tmpDir = new File("tmp/");
for (File f : tmpDir.listFiles()) {
f.delete();
}
tmpDir.delete();
}
}));
どちらも特に良い解決策ではありません。理想的なのは、すべてのスレッドが終了するまでシャットダウンフックを待機させてから続行することです。これができるかどうか誰かが知っていますか?