簡體   English   中英

如何處理具有多個線程的文件,以便每個文件僅由一個線程處理

[英]How to process files with multiple threads so each file is processed by only one thread

我目前有一個產生50個線程的Java程序,其目標是查看一個目錄,該目錄中有許多文件被寫入並將這些文件上傳到ftp服務器然后刪除它們。 現在,我有一種超級hacky方式在每個線程中循環遍歷dir並在ConcurrentMap上設置鎖定以跟蹤線程何時處理相同的圖像以防止重復工作。 它工作但似乎不對。

所以問題是..在Java中,什么是在多線程程序中觀察目錄並確保每個線程只在一個其他人沒有的文件上運行的首選方式。

更新:我正在考慮創建一個線程池,每個線程的警告都有一個ftpclient連接,我必須保持打開並防止超時。

更新:如何使用http://download.oracle.com/javase/tutorial/essential/io/notification.html

使用ExecutorService將工作提交與線程邏輯本身的線程分離(另請查看父接口Executor的文檔,以了解更多有關其用途的信息)。

使用ExecutorService ,您只需將工作(在您的情況下,文件)提供給它,線程將在它們可用時進行工作。 您可以配置許多ExecutorServices選項和風格:單線程,最大線程數,無界線程池等。

也許有一個主線程搜索目錄並將任務提供給工作線程?

國際海事組織,它試圖寫一些自己這樣做的東西是很麻煩的。 並行批處理有很多細微差別,最好將API學習到為您完成的框架。

在過去,我使用過Spring Batch (開源)和Flux (需要許可證)。 它們都允許您配置監視文件目錄的作業,然后以並行方式處理這些文件。 只要您願意花時間學習其API,那么您無需擔心同步哪個進程處理哪些文件。

只需快速了解Spring BatchFlux的優缺點:

  • Spring批處理主要是XML配置,而Flux有一個很好的GUI設計器
  • 如果您已經熟悉Spring框架,那么Batch將更加自然。 (否則,作為起點,他們的文檔非常適合基本用例)
  • Spring批處理需要從外部進行調度(通常使用Quartz),而Flux也包括調度
  • 對於像監控目錄/ FTP / SFTP /電子郵件以啟動工作這樣的事情,Flux更好(並且更直觀)

我確信還有其他框架可以做到這一點......這些只是我熟悉的兩個框架。

我將設置一個文件處理程序類,它接受一個目錄並具有一個並發鎖定的.nextFile函數,該函數傳遞目錄中的下一個文件。 這樣每個線程都會請求一個文件,每個線程都會獲得一個唯一的文件

解決方案真的需要多線程嗎? 除非每個連接限制到目標FTP服務器的最大上傳速度,否則一次發送一個更容易嗎?

通過單個FTP連接以1Mbps(假設最大上傳速度)順序發送50個1MB的文件並不比使用50個FTP連接以~20Kbps同時發送相同的50個文件慢,不是嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM