我有一個簡單的java程序,它創建一系列存儲在本地tmp目錄中的臨時文件。我已經添加了一個簡單的關閉鉤子,它遍歷所有文件並刪除它們,然後在退出程序之前刪除tmp目錄。這裏是代碼:在關機鉤中斷Java中的所有線程
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();
}
}));
也不是一個特別好的解決方案。最理想的是讓shutdown hook等待,直到所有線程都已經終止,然後再繼續。有誰知道這是否可以做到?
什麼關於讓每個線程清理自己的臨時文件?我發現有相同的類負責創建和刪除自己的臨時文件很有幫助。 – 2012-07-19 19:04:17
['File.deleteOnExit()'](http://docs.oracle.com/javase/6/docs/api/java/io/File.html#deleteOnExit())會得到什麼結果?似乎「正常終止」要求同樣適用於關閉鉤子執行。 – erickson 2012-07-19 19:05:08
@erickson'File.deleteOnExit();'適用於子文件,但不適用於tmp目錄。大概原因是不能保證在目錄試圖刪除之前刪除所有的子文件。這導致一個非空目錄,這是java不能刪除的目錄。 – ewok 2012-07-19 19:46:08