首页 文章

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

提问于
浏览
0

这是一个多线程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

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

    这取自产品的文档 . 提供了两种排序:

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

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

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

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

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

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

相关问题