[英]Writing to multiple files in a multithreaded way in java
我有一個 Java 應用程序,我需要在其中使用多線程。 我有一個ID'
列表,它是存儲在 DynamoDB 中的表的主鍵。
說,名單是:
| ID_1 | ID_2 | ID_3 | ID_4|.......| ID_n|
現在我希望多個線程讀取這些ID's
並對每個 ID 執行以下操作:
每個線程應該取一個 ID 並查詢 DynamoDB 表(有兩個 dynamo DB 表,ID 是主鍵)
查詢每個 Dynamo DB 表的結果應存儲在單獨的文件中。
本質上, Thread_1
應該選擇一個 ID 說ID_1
,它應該查詢 DynamoDB 表DDB_1
和DDB_2
。 查詢的結果DDB_1
應該在File1
和結果DDB_2
中應該去File_2
。 這需要為所有線程完成。 最后,當所有線程都完成執行時,我應該有兩個文件File_1
和File_2
其中包含來自所有線程的查詢結果。
我提出了一個解決方案,讓所有生產者線程(從 Dynamo DB 獲取查詢結果的線程)將查詢結果排隊到一個寫入文件的消費者線程File_1
。 類似地,所有生產者線程都寫入第二個隊列,第二個消費者線程寫入File_2
。
你覺得上面的方法有什么缺陷嗎? 在這種情況下,有沒有更好的方法來應用多線程?
如果我理解正確,您需要 2 個線程,每個線程查詢一個 db-table 並將結果發布到一個文件中。 見下。
APPLICATION
|
|-->THREAD --> DB_1 --> file1
|
|-->THREAD --> DB_2 --> file2
首先,這應該完全沒問題,您不是從相同的數據讀取和寫入,這意味着這是線程安全的。 你想要這樣做的方式是為每個線程創建一個類(只是一個例子)。 通過擴展 runnable 來做到這一點。 然后將所有連接到數據庫的代碼放在 run 方法中。 長示例: http : //www.tutorialspoint.com/java/java_multithreading.htm
class Thread1 implements Runnable {
public void run() {
Connect/write
}
}
使用調用
Thread1 t = new Thread1();
t.start();
只要您在這些線程之一中閱讀 ID 時沒有編輯 ID,這應該可以正常工作。
這會將方法鎖定到單個線程,例如,當寫入同一個文件時,這是必要的,因為線程將相互中斷。
public synchronized void write(text, file1, file2){
}
像線程中的普通方法一樣調用它。 這並不能保證線程訪問這些方法的順序,在這個例子中它是先到先得。
這就是您想要實現的目標:-
ID_1 -> Thread1 -> Query DB1 -> ConsumerSingleton -> Write data to File 1
-> Query DB2 -> ConsumerSingleton -> Write data to File 2
ID_2 -> Thread2 -> Query DB1 -> ConsumerSingleton -> Write data to File 1
-> Query DB2 -> ConsumerSingleton -> Write data to File 2
ID_3 -> Thread3 -> Query DB1 -> ConsumerSingleton -> Write data to File 1
-> Query DB2 -> ConsumerSingleton -> Write data to File 2
..
..
ID_N -> ThreadN -> Query DB1 -> ConsumerSingleton -> Write data to File 1
-> Query DB2 -> ConsumerSingleton -> Write data to File 2
由於您使用的是單個消費者對象,因此您不必處理 file1 和 file2 的同步寫入操作。 但是,您必須同步操作/方法,您的線程將在其中將結果轉儲到使用者的集合。 您可以使用 ConcurrentHashMap 從您的消費者類中的不同線程收集結果,這是線程安全的。
此外,由於您將根據唯一 ID 的行級鎖從 DB1 和 DB2 讀取行,因此在多個線程嘗試訪問時不應發生。 如果不是這種情況並且 2 個線程嘗試讀取具有相同 ID 的行,則可能會發生爭用。
你覺得上面的方法有什么缺陷嗎?
我一個都看不出來但是當然,我只能根據您對算法的高級描述發表評論。 將有正確和錯誤的方法來實施它。
在這種情況下,有沒有更好的方法來應用多線程?
這很難說。 但我想不出任何明顯更好的替代方案。 有(毫無疑問)的替代品,但你可以客觀確定的唯一途徑,這是最好1。將實施各種方案和比較基准。
請注意,此應用程序的瓶頸可能是:
(可能前者會占主導地位。)由於兩者都將受到“外部”因素(例如磁盤 I/O、網絡、數據庫 CPU 負載)的限制,因此您很可能需要“調整”工作線程的數量你用。
1 - 我假設您的意思是具有最佳吞吐量的那個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.