Java线程从另一个线程重新分配本地线程变量

时间:2014-03-15 17:14:17

标签: java multithreading mergesort

这是一个多线程mergesort程序。第一轮线程对数组的各个部分进行排序,然后它们需要开始连接在一起(即,线程1加入线程0,线程0将它们合并在一起)。我不知道如何从线程1获取endRow并将其传递给线程0以便它可以合并。以下是我到目前为止的情况:

制作所有主题:

public static void sort(int[] X, int numThreads){
    int n = X.length/numThreads;

    for(int i = 0; i < numThreads; i++){
            Thread t = new Thread(new worker(X, i*n, (i+1)*n-1));
            t.start();
            threadPool.add(t);
    }

    try{
        for(int i = 0; i < numThreads; i++){
                    threadPool.get(i).join();
        }
     }

     catch(InterruptedException e){
                e.printStackTrace();
     }

}

这就是线程的运行方式:

public void run(){
        if(flag == false){
    Arrays.sort(sorted, startRow, endRow);
            flag = true;
        }
        else{
            merge();
            sorted = Arrays.copyOfRange(finalArray, startRow, endRow);
        }
}

public void merge(){

        int n = (endRow - startRow)/2 + startRow;
        int i=startRow,j=n+1,k=startRow;

        for(; i<n && j<endRow;++k){
            if( sorted[i] <= sorted[j] )
                finalArray[k]=sorted[i++];
            else
                finalArray[k]=sorted[j++];
        }

        while(i<n)
            finalArray[k++]=sorted[i++];
        while(j<endRow)
            finalArray[k++]=sorted[j++];
}

1 个答案:

答案 0 :(得分:0)

你所拥有的是单独行动的单独线程。你需要的是并行的线程。而不是粘贴代码(这是实质性的),你可以下载我工作的开源项目,做你想要的。 TymeacDSE

这取自产品的文档。提供了两种类型:

1 - Tymeac根据您指定的阈值或默认阈值将大数组拆分为排序子集。 Tymeac将排序子集分散到会话中的所有可用线程。 Tymeac线程调用Arrays.sort()作为排序子集,然后查找要合并的其他已完成的排序子集。

当最后一个任务完成时,Tymeac会对来自所有其他任务的已排序子集重复进行两个数组合并,直到只剩下一个子集为止。这是返回给调用者的最终数组。 (实际上,在所有任务完成之后应该只剩下一个子集,这是最终的数组。但是,你永远不会知道多线程和共享变量。)

创建单独的排序子集(需要额外的内存)的好处是,一旦排序,排序的子集可以与其他排序子集同时合并,然后可以与其他排序子集合并,等等。 ,同时进行排序和合并。

此方法需要较少的整体任务但保留更长的内存。完成单个请求的时间稍长,但是当多个请求正在工作时,此排序的总体吞吐量要好得多,然后排序,因为它将任务的总数保持在最小值。

2 - Tymeac将大数组拆分为如上所述的排序子集。 Tymeac将排序子集分散到会话中的所有可用线程。 Tymeac线程调用Arrays.sort()作为排序子集,并返回合并阶段的子集。

当最后一个任务完成时,Tymeac会分散已排序的子集以进行合并,并收集合并的子集以进行最终合并以返回给调用者。或者,如果部分合并的子集的数量很大,那些合并的子集将再次分散以进行其他合并,并在complete()方法中再次收集。对于单个请求,此方法比上面的Sort略快,特别是当有许多线程来处理传播并且数组大小很大时。