Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程快速排序比普通快速排序耗时更长_Java_Multithreading_Quicksort - Fatal编程技术网

Java 多线程快速排序比普通快速排序耗时更长

Java 多线程快速排序比普通快速排序耗时更长,java,multithreading,quicksort,Java,Multithreading,Quicksort,我已经使用多线程实现了快速排序,它正确地排序整数数组,但是执行速度比普通的快速排序要长。 例如,对10000个整数进行排序 多线程:6856毫秒 正常:1毫秒 我不知道我的代码出了什么问题 public void run() { quickSort1(this.Array,this.low,this.high); } int partition(int[]A,int l,int r) { int v = A[r]; int i = l; int j = r;

我已经使用多线程实现了快速排序,它正确地排序整数数组,但是执行速度比普通的快速排序要长。 例如,对10000个整数进行排序 多线程:6856毫秒 正常:1毫秒

我不知道我的代码出了什么问题

public void run()
{
    quickSort1(this.Array,this.low,this.high);
}
int partition(int[]A,int l,int r)
  {
    int v = A[r];
    int i = l;
    int j = r;

    while(i<j)
    {
        while(A[i]<v)
        {
            i++;
        }

        while((i<j)&&(A[j]>=v))
        {
            j--;
        }

        if(i<j)
        {
            int C = A[i];


            A[i] = A[j];
            A[j] = C;
        }

        else
        {
            int D = A[i];

            A[i] = A[r];
            A[r] = D;
        }
    }


    return i;
}



void quickSort1(int[] A,int l,int r)
{
    int i;
    if(r>l)
    {
        i = partition(A,l,r);

        quickSort sort1 = new quickSort(A,l,i-1);
        Thread t1 = new Thread(sort1);


        quickSort sort2 = new quickSort(A,i+1,r);
        Thread t2 = new Thread(sort2);
        t1.start();
        t2.start();

        try
        {
            t1.join();
            t2.join();
        }catch(Exception e){}



    }
}

void normal_quickSort(int[] A,int l,int r)
{

    int i;
    if(r>l)
    {
        i = partition(A,l,r);

        normal_quickSort(A,l,i-1);
        normal_quickSort(A,i+1,r);
    }
}
public void run()
{
quickSort1(this.Array,this.low,this.high);
}
int分区(int[]A,int-l,int-r)
{
int v=A[r];
int i=l;
int j=r;
而(i2个问题

(1) 您创建的线程太多。创建线程的成本很高。对于绑定计算的任务,如果您创建的线程总数大于平台中的CPU数量,则可能是错误的

诀窍是将线程汇集在一起(例如,创建一个
java.util.concurrent.ThreadPoolExecutor
,并为其指定要执行的任务)

(2) 您正在将工作分解为太小的任务。同步线程和在线程之间传递数据的成本也很高。虽然没有创建和销毁线程那么高,但您要执行的次数仍然有限制

您的算法可能会将工作分配到以下位置:为线程提供一个包含一个元素的列表,并要求线程对其进行“排序”。这对于多线程来说是一个小得可笑的任务

要实现快速排序,您必须不断地将数组拆分为越来越小的块,但您不必将每个块分配给不同的线程,而且在它们足够小之后,您不应该这样做。我不知道小到什么程度才足够小(100?1000?10000?),但您可以很容易地进行实验来找出答案。

两个问题

(1) 您创建的线程太多。创建线程的成本很高。对于绑定计算的任务,如果您创建的线程总数大于平台中的CPU数量,则可能是错误的

诀窍是将线程汇集在一起(例如,创建一个
java.util.concurrent.ThreadPoolExecutor
,并为其指定要执行的任务)

(2) 您正在将工作分解为太小的任务。同步线程和在线程之间传递数据的成本也很高。虽然没有创建和销毁线程那么高,但您要执行的次数仍然有限制

您的算法可能会将工作分配到以下位置:为线程提供一个包含一个元素的列表,并要求线程对其进行“排序”。这对于多线程来说是一个小得可笑的任务


要实现快速排序,您必须不断地将数组拆分为越来越小的块,但您不必将每个块分配给不同的线程,而且在它们变得足够小之后,您不应该这样做。我不知道多小才算足够小(100?1000?10000?),但您可以很容易地进行实验来发现。

我要说的是,创建线程所需的开销大于在单个线程中进行计算所需的开销。只有一个问题:您有多少线程?@BitExodus从外观上看,是数组元素数减1的两倍。@BitExodus每次对数组I进行分区时nto two我有两个线程来处理子数组。@BitExodus这是因为我没有线程创建的开销;)我要说的是,创建线程所需的开销大于在单个线程中进行计算所需的开销。只有一个问题:您有多少个线程?@BitExodus从外观上看,是数组元素数减去1的两倍。@BitExodus每次将数组分成两部分时,我有两个线程来处理子arrays@BitExodus这是因为我没有线程创建的开销;)谢谢你的详细回答。我会尝试实现它。谢谢你的详细回答。我会尝试实现它。