一千萬個為什麽

搜索

Java並行查找數組的最小值

在修改即將到來的考試時,我的解決方案是使用2個線程查找數組的最小值。

我必須為int創建一個包裝器,以通過引用傳遞最小值。

你們有什麽感想?

public class FindMin {

    public static void main(String[] args) {

        int[] data = {99,9,14,5,7,33,6,8,21,29,33,44,55,66,77,88,2, 3, 1};
        IntObj min = new IntObj(data[0]);

        Proc p1 = new Proc(0, (data.length/2)-1, data, min);
        Proc p2 = new Proc(data.length/2, data.length, data, min);

        p1.start();
        p2.start();

        try {
            p1.join();
            p2.join();
        }
        catch (InterruptedException e) {}
        System.out.println("Min value: "+min.value);
    }

}

class Proc extends Thread {
    int ub, lb;
    int[] data;
    IntObj min;

    public Proc(int lb, int ub, int[] data, IntObj _min) {
        this.ub = ub;
        this.lb = lb;
        this.data = data;
        min = _min;
    }
    public void run() {
        for(int i = lb; i < ub; i++) {
            compareSet(data[i]);
        }
    }
    public void compareSet(int val) {
        synchronized(min) {
            if(val < min.value) {
                min.value = val;
            }
        }
    }
}
class IntObj {
    int value;
    public IntObj(int _value) {
        value = _value;
    }
}

最佳答案

如果必須為每次比較進行同步,則使用兩個線程的任何潛在收益都會因同步開銷而得到補償。讓每個線程在其一半中找到最小值並將結果寫入它們自己的輸出變量。然後比較主線程中的兩個結果。

如果最小值位於 data [data.length/2-1] ,則代碼將給出錯誤的結果。

轉載註明原文: Java並行查找數組的最小值