我有一个简单的 java 程序,它创建了一系列存储在本地 tmp 目录中的临时文件。我添加了一个简单的关闭挂钩,它遍历所有文件并删除它们,然后在退出程序之前删除 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 hacks:
黑客#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();
}
}));
两者都不是特别好的解决方案。理想的做法是让关闭钩子等到所有线程都终止后再继续。有谁知道这是否可以做到?