使用多个线程排序

时间:2010-11-09 03:42:39

标签: java multithreading sorting

我试图使用4个线程对多个整数进行排序,拆分数组然后重新组合。我想我已经完成了使用2个线程,任何人都可以从这里帮助我如何使用4?

import java.util.Random;
import java.util.Arrays;

public class threadSort implements Runnable {
private static final int L = 64;
private static int[] nums;
private static Random rand;

public void run() {
    //sorting upper half
    Arrays.sort(nums, nums.length/2, nums.length);
}

public static void main(String args[]) throws InterruptedException {

    nums = new int[L];
    rand = new Random();

    //fill the array
    for(int i=0; i<nums.length; i++) {
        nums[i] = rand.nextInt(10);
    }

    Thread t = new Thread(new threadSort());
    t.start();

    //sorting lower half
    Arrays.sort(nums, 0, nums.length/2);

    t.join();

    /* merge */
    int j = 0;
    int k = nums.length/2; 
    int[] tmp = new int[nums.length];
    for (int i=0; i<tmp.length; i++){
        if (j < nums.length/2) {
            if (k < nums.length) {
                if (nums[j] < nums[k]) {
                    tmp[i] = nums[j++];
                } else {
                    tmp[i] = nums[k++];
                }
            } else {
                /* reached end of second half, copy first*/
                tmp[i] = nums[j++];
            }
        } else {
            /* reached end of 1st half, copy 2nd*/
            tmp[i] = nums[k++];
        }
    }
    nums = tmp;


    //Testing Sort and Total
    int count = 0;

    for(int i=0; i<nums.length; i++){
    System.out.print(nums[i] + " ");
    count++;
    }
    System.out.println();
    System.out.println("Total amount of Integers = " + count);
}

}

这就是我到目前为止所拥有的 我想坚持我所拥有但在

中再抛出2个线程

1 个答案:

答案 0 :(得分:1)

最好的方法是使用forkjoin。基本上,您递归地将数据划分为二进制块,直到您想要使用足够小的块。使用DL的forkjoin框架是一个有趣的练习,但如果你想保持简单,请继续阅读。

您需要做的就是两次调用当前算法。也就是说,用它来将数据分成两半。然后在每一半调用你的算法。当两者都完成后,合并他们的结果。