簡體   English   中英

並發線程合並排序

[英]concurrent Threads Merge Sort

我必須編寫一個並發的合並排序應用程序。 每次數組被拆分時,我都必須為右半部分創建一個新線程(最大線程數為 5 -> 所以是 5 次),它繼續 Mergesort 算法。

在此處輸入圖片說明

那是我的程序:

class Mergesorts implements Runnable{

    private int[] internal;

    Mergesorts(int[] arr) {
        internal = arr;
    }

    private void processCommand(int [] array) {
        if (array.length > 1) { 
            int[] left = leftHalf(array);
            int[] right = rightHalf(array);
            processCommand(left);
            processCommand(right);
            merge(array, left, right);
        }
    }

    public int[] rightHalf(int[] array) {
        int size1 = array.length / 2;
        int size2 = array.length - size1;
        int[] right = new int[size2];
        for (int i = 0; i < size2; i++) {
            right[i] = array[i + size1];
        }
        return right;
    }

    public void run() {
        processCommand(internal);
    }
}

如何重寫我的代碼以如上所述同時排序?

如何編輯我的代碼,使其最多只能創建 5 個線程而不是更多?

private void processCommand(int [] array) {
    if (array.length > 1) {


        int[] right = rightHalf(array);
        int[] left = leftHalf(array);


        Mergesorts worker2 = new Mergesorts(right);
        Thread s = new Thread(worker2);
        s.start();

        processCommand(left);

        try {
            s.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        merge(array, left, right);}

}

在 processCommand() 方法中啟動新線程,而不是在 rightHalf() 方法中。 如果有可用線程,然后代替排隊叫號processCommand(右),構建一個新的Mergesorts對象right ,並啟動一個線程它。 不要忘記在線程上調用 join() 以確保它在進行合並之前完成。

為了提高並行性,您可以在處理數組的左半部分之前在數組的右半部分啟動新線程,因此兩者是同時完成的 - 也就是說,將 processCommand(left) 移動到執行此操作的塊之后processCommand(right) 或啟動一個新線程。 join() 調用應該在兩半完成之后,但在合並之前。

編輯:你越來越近了; 要解決您的評論,您需要這樣的東西:

private void processCommand(int [] array) {
    if (array.length <= 1)
        {return;}

    int[] left = leftHalf(array);
    int[] right = rightHalf(array);
    Thread rightThread = null;

    if (b <= 5) {
        ++b;
        Mergesorts worker = new Mergesorts(right);
        rightThread = new Thread(worker);
        rightThread.start();
    } else {
        processCommand(right);
    }

    processCommand(left);

    if (null != rightThread) {
        try {
            rightThread.join();
            b--
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            // better error handling would be good
        }
    }

    merge(array, left, right);
}

b還需要 volatile 以確保不同的線程可以看到當前正在執行的線程數。

暫無
暫無

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

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