簡體   English   中英

當場運行多個線程並等待所有線程完成,方便且安全的hashMap

[英]Run multiple threads on the spot and wait for all to finish, convenience and safe hashMap

我剛剛開始學習線程背后的概念,但我陷入了一個問題。

我有N Strings數組,其中N是變量,但總是<= 5 我有另一個空數組,容量N

現在,我必須對每個字符串one by one進行一些復雜的計算,並且每個結果都將進入空數組,並位於與剛剛檢查的字符串相同的索引上。

一切結束后,將分析結果數組並保留最長的結果。 所有這些發生的線程是主線程。

計算需要大量時間,因此我在考慮打開N新線程並一起評估所有線程是否值得。

值得一提的是,計算涉及在HashMap<String, customObject>上查找字符串,這對於所有HashMap<String, customObject>都是相同的。 因此,有了線程,他們將一起訪問它。 他們不會編輯它,只是尋找值。 映射可以更改,但是永遠不能更改,因為它會在代碼的其他部分(主線程)中更改。

例:

//Current approach

HashMap<String, Object> m = new HashMap<>(); //filled with 10^6 values

String[] data = new String[3];
Object[] results = new String[3];

results[0] = complexCalculationsAndSearcOnHashMap(data[0]); 
results[1] = similarComplexCalculationsAndSearcOnHashMap(data[1]);
results[2] = otherComplexCalculationsAndSearcOnHashMap(data[2]);

//Now every complex calculation has to wait until the last one ended before starting. But the only thing that actually should have to wait is this next line:

Object finalResult = longest(results);

所以我的問題是,我應該構建3個線程並將復雜的計算放入run方法嗎? 是方便還是我弄錯了整個線程概念? 這在應用程序中造成了瓶頸,需要很長時間才能完成。

線程示例:

HashMap<String, Object> m = new HashMap<>(); //filled with 10^6 values

    String[] data = new String[3];
    Object[] results = new String[3];

    Thread t0 = new Thread(){

    public void run(){
      results[0] = complexCalculationsAndSearcOnHashMap(data[0]);
    }
};

//Thread t1, t2..
//t0.start(), t1.start()...

 Object finalResult = longest(results);

如果先前的答案是肯定的,當它們獨立運行時,我如何在最后一行等待所有3個線程完成? 我是否將所有3個都加入循環?

最后但並非最不重要的一點是,以這種方式使用HashMap 是否安全
還是應該切換到另一個與線程配合使用的集合對象? 我已經讀過一些關於此的想法,似乎沒有人同意。 會慢一點嗎? 除非目前非常必要,否則我不會失去任何優化。

編輯:

應當指出,“它們需要很長時間才能完成”不應被認為是理所當然的。 雖然N函數在97%的時間中確實需要很長時間才能完成,但它們可能幾乎是瞬時的。 我不知道這是否有所作為。

**編輯2:**

我不僅要問如何運行所有4個代碼並等待它們完成,還需要知道在這種情況下這是否是正確的選擇,或者它是否不會改變任何事情,還需要了解是否還可以以這種方式使用hashMap。

**代碼上的詳細信息**

  • 所有這些都發生在同一個對象內,從未使用任何靜態字段。
  • HashMap早在另一個對象中就已初始化。
  • HashMap可以更改,但是在另一個對象中,可以在同一線程上更改。 因此在其他3個線程運行時不會發生。
  • 這是應用程序唯一使用更多線程的時間。

您可以使用簡單的方法並為您的每個“計算”創建一個線程

    Thread[] workers = new Thread[count];
    for (int i = 0; i < count; i++) {
        final int index = i;
        //create thread to calculate i-th value
        workers[i] = new Thread(new Runnable() {
            @Override
            public void run() {
                results[index] = complexCalculationsAndSearcOnHashMap(data[index]);
            }
        });
        workers[i].start();
    }
    for (int i = 0; i < count; i++) {
        //wait until threads execution is finished
        workers[i].join();
    }

    //Test output
    System.out.println(Arrays.toString(results));

如果您的計算功能取決於索引...,則可以使用索引選擇相應的函數,或者在循環外創建線程。

暫無
暫無

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

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