2011-08-04 16 views
2

我有一個java線程A連續輪詢文件夾RESULTFOLDER並檢查是否存在一些新文件。
現在這些文件被其他機器上運行的其他程序發佈到RESULTFOLDER.Now發佈的文件都是xml文件(只有xml).so在任何時候,RESULTFOLDER都只能保存xml文件。
現在我的線程A連續輪詢RESULTFOLDER並一次解析xml文件,然後刪除它。
現在有時會發生什麼情況是,如果線程A在其他程序發佈文件A時嘗試讀取並解析文件A。在這種情況下,我在解析file.Saying文件的成熟結束時出現異常。
我該如何解決問題?解析xml文件時,當另一個線程正在解析它時,其他線程正在創建該文件時提前結束文件異常

我認爲的一種方法是檢查文件創建的日期時間,並確保該文件至少需要1分鐘左右。但我不認爲java提供了這樣的API。如何解決這個問題?

回答

3

您可以將.xml文件寫入該文件夾,然後寫入一個單獨的控制文件。控制文件將有零字節,並具有不同的擴展名,例如.ctl,但名稱的第一部分相同。

當線程輪詢結果文件夾找到.ctl文件時,它知道打開擴展名爲.xml的同名文件是安全的。

該方法還有一個額外的好處,即使在寫作任務位於另一臺計算機上時,它也可以工作。

1

在創建時創建線程調用setWritable(true,true)和setReadable(true,true)。這將防止非創建線程在創建線程創建時訪問該文件。文件創建後,setWritable(true,false)和setReadable(true,false)。輪詢線程將需要在輪詢時間檢查寫入能力以確保應從中讀取文件。

或者,您可以爲目錄提供互斥鎖。讓正在創建文件的線程獲取目錄的互斥體,創建並填充文件,然後釋放互斥體。當輪詢線程需要檢查時,抓住互斥鎖,檢查目錄,處理文件,然後釋放互斥鎖。

0

三種方法:

  1. 當文件被寫入,是具有名稱foo.tmp。完整書寫後,製片人將其更名爲。因此,消費者在生產者完全寫入之前不會看到XML文件。

  2. (與@aaaa bbbb相同的答案)。 完成寫入文件後,會創建名爲foo.ctl的另一個文件(可以爲空)。消費者在看到CTL文件之前不會處理XML文件,然後它可以刪除這兩個文件。

  3. (與@ tafoo85相同的答案)。 消費者無法讀取文件,直到被寫入並被生產者讀取爲可讀。

即使生產者線程在編寫不完整的XML文件的過程中死亡,這些方法還有正常工作的額外好處。

+0

不錯的總結。當然,我最喜歡你的答案2。重命名遠程複製的文件時遇到問題,所以我更喜歡使用控制文件方式。 –