4 回答

TA貢獻1829條經驗 獲得超9個贊
還是這段代碼會保證執行過程永遠不會在處理單個文件時嘗試中途關閉?
此代碼保證此處啟動的關閉不會在處理單個文件的過程中發生。也許很明顯,您代碼中的其他地方可以調用System.exit
,而您對此沒有任何保護。
您可能需要考慮防止System.exit
被調用,然后讓您的代碼正常關閉(即通過方法的正常完成main
)。

TA貢獻1780條經驗 獲得超5個贊
萬一你真的有多個線程調用不同的方法,synchronized這樣使用實際上是一個聰明的主意,因為它處理了“多線程”的事情。
您可以考慮縮小第一個塊的范圍:
Path currentFileName = getNextFile();
String string = readFile(currentFileName);
synchronized(monitor) {
單獨讀取文件應該不是問題。(當然,除非您此處的代碼必須保證由 返回的 PathgetNextFile()得到完全處理)。

TA貢獻1744條經驗 獲得超4個贊
如果代碼在synchronized
塊中執行并且塊在同一個對象上同步,并且synchronized
循環中塊中調用的方法while
完全在與其調用者相同的線程上運行,則不存在文件相關進程被中斷的風險通過調用System.exit
. _
這就是說,它看起來確實像是一個有爭議的補丁,只是稍微改進了有爭議的代碼。
可能還存在更具體的饑餓風險,因為顯示的 while 循環似乎盡可能快地向這些文件操作發送垃圾郵件,因此在退出時嘗試獲取鎖可能不會成功。
探索的一般方向是將無限while
循環轉換為ScheduledExecutorService
+ Runnable
,使用自己的監視器執行每 x 時間量以防止對相同文件的重疊操作,并在shutdown
調用該方法時優雅地終止它。

TA貢獻1775條經驗 獲得超11個贊
您可以使用關閉掛鉤。來自 javadocs:
關閉掛鉤只是一個已初始化但未啟動的線程。當虛擬機開始其關閉序列時,它將以某種未指定的順序啟動所有已注冊的關閉掛鉤,并讓它們同時運行。
由此,您可以從您的文件類中提供一個關閉掛鉤,如下所示:
public Thread getShutdownHook() {
? ? return new Thread(() -> {
? ? ? ? synchronized (monitor) {
? ? ? ? ? ? // gracefully handle the file object
? ? ? ? }
? ? });
}
這將在調用時調用Runtime.getRuntime().exit()(由 調用System.exit())。由于它也在監視器對象上同步,如果其他線程正在使用該文件,關閉掛鉤將阻塞直到它空閑為止。
添加回答
舉報