當然,使用「synchronized」的方式顯然很明顯。 但我創建了一個系統,設計用於在多個內核上運行,並在相同的毫秒內向該文件寫入不同的次數。因此,我認爲使用同步會嚴重損害性能。 我正在考慮使用Java的管道類(但不知道它是否會有所幫助) 或讓每個線程寫入不同的文件以及收集 這些寫入的附加線程,從而創建最終結果。 我應該提到的是,文章的順序並不重要,無論如何它都以時間戳 。 這兩個更好的想法是什麼?有沒有其他建議? 謝謝。將幾個線程同步寫入到java中的同一個文件中
1
A
回答
2
使用某種同步(例如單個互斥鎖)很容易實現。
如果我有足夠的RAM,我想創建某種爲每個登錄生產者線程一個隊列,日誌消費者線程在一個循環的方式所有隊列讀取(或類似的東西) 。
1
不是你的問題的直接答案,但logback項目內置同步功能,用於從不同線程寫入同一個文件,所以如果它適合你的需要,或者至少需要一個看看它的源代碼。由於它是爲速度而構建的,所以我非常肯定實現不被視爲理所當然。
1
如果您擔心,您將無法將所有線程寫入同一個文件而沒有性能問題。當我遇到這個問題(編寫自己的日誌記錄,回到Log4j之前),我在內存中創建了兩個固定大小的緩衝區,並讓所有生產者線程寫入一個緩衝區,同時從另一個緩衝區讀取專用的使用者線程,寫信給一個文件。這樣,寫入線程只需在獲取索引和將索引遞增到緩衝區並同步緩衝區時進行同步,並且只在當前緩衝區滿時阻塞。這是內存密集型,但速度很快。
對於其他想法,你可以看看Log4j和Logback這樣的記錄器如何工作,他們將不得不解決這個問題。
1
嘗試使用JMS。您在不同機器上運行的所有進程都可能發送JMS消息,而不是寫入文件。只創建一個接收消息並將它們寫入文件的隊列接收器。 Log4J已經具有這種功能:請參閱JMSAppender。
相關問題
- 1. 同時寫入JAVA中的多個線程的單個文件,按行同步
- 2. 找到幾個文件共同的線
- 3. java中的線程/同步
- 4. 在java中同步線程
- 5. 在Java線程中同步
- 6. jquery同步幾個事件
- 7. 在同一文本文件上寫入Java多個程序
- 8. 多個線程可以同時將數據寫入文件嗎?
- 9. Java多個文件不同的線程
- 10. Java同步線程
- 11. Java線程同步
- 12. Java線程「同步」
- 13. 同步兩個只有幾個文件不同的GIT分支
- 14. 多個RollingFileAppenders寫入同一個文件
- 15. 如何將多個線程同步到一個公共點
- 16. 防止線程寫入同一個文件
- 17. 同時寫入,分成幾個文件,不同長度
- 18. 在java中讀取和寫入同一個文件
- 19. 同步.NET中的多個線程4
- 20. 是否可以從多個線程寫入同一文件的不同部分?
- 21. java多線程(newCachedThreadPool),然後將結果寫入一個文件?
- 22. 在同一個鎖中的幾個線程
- 23. 將幾個sqlite數據庫同步到一個mysql數據庫
- 24. 同步線程中的同步問題
- 25. 爲Clojure中的多個閱讀器/單個寫入器同步線程
- 26. 用不同的過程在同一個文件中讀寫
- 27. 線程池中的多個線程在同一列表中寫入數據
- 28. 將輸出寫入到Talend ETL中的同一個xml文件中
- 29. java中的線程同步問題
- 30. 什麼是java中的線程同步?
您需要指定您以後的速度,吞吐量或等待時間。你需要在1ms內寫入10k m/s或任何給定的消息嗎?另外,如果你關心磁盤寫入的可靠性(你可以承受在處理崩潰時延遲寫入)。 – DaveC 2010-12-11 03:03:37