看板 java 關於我們 聯絡資訊
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)