簡體   English   中英

在java中以多線程方式寫入多個文件

[英]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 執行以下操作:

  1. 每個線程應該取一個 ID 並查詢 DynamoDB 表(有兩個 dynamo DB 表,ID 是主鍵)

  2. 查詢每個 Dynamo DB 表的結果應存儲在單獨的文件中。

本質上, Thread_1應該選擇一個 ID 說ID_1 ,它應該查詢 DynamoDB 表DDB_1DDB_2 查詢的結果DDB_1應該在File1和結果DDB_2中應該去File_2 這需要為所有線程完成。 最后,當所有線程都完成執行時,我應該有兩個文件File_1File_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。將實施各種方案和比較基准。

請注意,此應用程序的瓶頸可能是:

  • DynamoDB 查詢的有效吞吐量
  • 您可以將結果寫入文件的速率

(可能前者會占主導地位。)由於兩者都將受到“外部”因素(例如磁盤 I/O、網絡、數據庫 CPU 負載)的限制,因此您很可能需要“調整”工作線程的數量你用。


1 - 我假設您的意思是具有最佳吞吐量的那個。

暫無
暫無

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

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