作者tnsshnews (tnsshnews)
看板java
標題[問題] Java Multithreading Writ/Read/CreateFile
時間Mon Oct 22 11:16:36 2012
Dear all,
小弟為Multithreading新手一位, 過去鮮少寫過多執行序的問題。
目前程式執行需要三個執行序:
Thread-1: 持續監聽網路封包
Thread-2: 一有新封包接收到, 立刻寫入檔案
Thread-3: 每隔五分鐘產生一個新檔案(.bak), 任何新收到的封包,寫入最產生的檔案裡,
等一個五分鐘的新檔案產生之後, 上一個檔案的.bak便取消掉
(.bak的目的是確保該檔案目前還未關閉)
小弟目前做法是:
Thread-1: 每個幾秒鐘, 就詢問server, 是否有新封包, 如果有, 便一直塞入List中
Thread-2: 利用loop一直掃描Thread-1的List, BufferWriter寫入檔案, 並將以寫入檔案的資料從List刪除(確保List中資料都是未寫入檔案的)
Thread-3: 每隔五分鐘產生新檔案(.bak), 並將五分鐘內接收的新資料寫入該檔案,
下一個五分鐘產生新檔案時, 將上一個五分鐘產生的檔案改檔名(取消.bak), 關閉BufferWriter指向,
並將Thread-2的BufferWriter指向新的檔案(新的.bak)
目前已經完成差不多, 但測試時發現多問題
1. 如果一邊有新資料進來, 一邊又寫入檔案, 會不會造成非同步呢?
目前我是將寫過的資料, 從List刪除, 這樣可確保留在List的資料都是尚未寫入的,
但總覺得這樣寫很不漂亮!!
2. 因為每五分鐘換一次檔案, 所以寫檔案的Thread, 不會關掉BufferWriter, 但沒關掉
就不能改檔名。目前機制是, 還沒有換檔前, 檔案一直會有新資料寫進來,
因為產生的檔案是要給另一隻程式讀的, 為了避免另一隻程式不會讀到不完整的資料,
所以採取這樣的手法, 但也覺得這樣不夠漂亮@@
感激不盡!!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.79.199.63
→ cha122977:不知道Observer pattern(觀察者模式)適不適合 10/22 13:03
推 PsMonkey:看到原 po 跑去 CodeJob 發案,我開始不懂了... 10/22 15:22
→ PsMonkey:所以原 po 是想要問什麼?看起來不像完全沒東西阿? 10/22 15:23
→ tnsshnews:有東西 10/22 17:40
→ tnsshnews:誰能救救我QQ 10/22 17:41
→ PsMonkey:==.=== 邏輯都出來了,是哪裡寫不出來? 10/22 17:43
→ tnsshnews:就是改檔案的地方, 檔名改不掉, 10/22 17:45
推 No:終於講出問題了,我剛還在想問題是不是thread-safe 10/22 17:46
→ tnsshnews:結果是因為寫檔案是bufferwriter沒有close 10/22 17:47
→ tnsshnews:但close buffer就不能寫檔案了@@ 10/22 17:49
→ tnsshnews:救命啊!! 10/22 17:50
※ 編輯: tnsshnews 來自: 203.79.199.63 (10/22 18:02)
推 PsMonkey:那就重新打開阿? 你這樣子問問題喊救命,我就要鎖文了 10/22 17:56
→ PsMonkey:==.=== 就要 Thread-3 啟動時等 Thread-2 關掉之後再作 10/22 18:29
※ 編輯: tnsshnews 來自: 180.218.158.208 (10/22 20:05)