Java 多线程排序

Java 多线程排序,java,multithreading,sorting,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

我尝试使用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);
}

}
import java.util.Random;
导入java.util.array;
公共类threadSort实现可运行{
专用静态最终整数L=64;
私有静态int[]nums;
私有静态随机兰德;
公开募捐{
//分拣上半部分
Arrays.sort(nums,nums.length/2,nums.length);
}
公共静态void main(字符串args[])引发InterruptedException{
nums=新整数[L];
rand=新随机数();
//填充数组
对于(int i=0;i来说,最好的方法是使用。基本上,您可以递归地将数据划分为二进制块,直到有足够小的块可以使用为止。使用DL的forkjoin框架是一个有趣的练习,但如果您想保持简单,请继续阅读

您只需调用当前算法两次。也就是说,使用它将数据分成两半。然后在每一半上调用您的算法。完成这两个操作后,合并它们的结果。

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


您只需调用当前算法两次。也就是说,使用它将数据分成两半。然后在每一半上调用您的算法。完成这两个操作后,合并它们的结果。

我建议使用递归方法来允许不确定大小的数组。我真的只希望它用于64整数的数组。我希望这适用于homework或个人教育。排序64个元素通常是(取决于比较器实现)这是一个非常简单的操作,创建线程和同步内存模型的开销应该远远超过任何性能增益。我建议使用递归方法来允许不确定大小的数组。我真的只希望它用于数组64 int。我希望这是用于家庭作业或个人教育。排序64个元素是典型的ly(取决于比较器实现)是一个非常简单的操作,创建线程和同步内存模型的开销应该远远超过任何性能增益。+1,但是…Doug Lea现在使用DL了吗?仅供参考,
ForkJoin
是Java 7并发包的一部分(从我看到的情况来看).DL是我大学时的教授。是的,它的目标是在Java 7中。请参阅:+1,但是…Doug Lea现在使用DL吗?仅供参考,
ForkJoin
是Java 7并发包的一部分(据我所见)。DL是我大学时的教授。是的,它的目标是在Java 7中。请参阅: