gpt4 book ai didi

java - 如何使一个简单的函数通过线程运行

转载 作者:行者123 更新时间:2023-12-01 14:12:32 25 4
gpt4 key购买 nike

我最近一直在使用线程,只是想要一些建议。我将函数代码放在这里只是为了解决任何歧义。

private void sort() throws FileNotFoundException, InterruptedException{

int i;
int largest = data.get(0) ;
int n = fullsize;//data.getsize
int [ ] tmp = new int [ n ] ;

for ( i = 1; i < n ; i++)
if ( largest < data.get(i) )
largest = data .get(i) ;
int [ ] count = new int [ largest+1] ;

for ( i = 0 ; i <= largest; i++)
count [ i ] = 0 ;

for ( i = 0 ; i < n ; i++)
count [ data .get(i) ]++;

for ( i =0+ 1 ; i <= largest; i++)
{
count [ i ] =count[i]+count[i-1];
output= output.concat(Integer.toString(count[i]));
}

System.out.print("Thread "+Thread.currentThread().getId()+":"+ output+"\n");


/* for(int b=0; i<count.length;b++)
System.out.print(count[b]);*/
for (i=n-1; i >= 0; i--)
{
tmp [count[data.get(i)] -1] = data.get(i);
count[data.get(i)]--;
}

for ( i =0 ; i < n ; i++)
{
data.add(i, tmp[i]);
}


}

这个函数基本上只是以相当复杂的方式对链接列表进行排序,但我必须使用这个函数。这就是我想要做的多线程功能。但现在我的问题是,您将如何做到每个线程或多或少执行相同量的工作?我想将数组分成几个部分,然后发送每个部分以按线程排序?但我不确定这是否是这样做的方法。任何方向正确的点都会很棒。

最佳答案

拆分数组可以进行并行排序,也可以进行并行合并。例如,考虑以下数组:

[3,2,6,4,9,7,12,1]

这可以分成如下几个部分:

[3,2,6,4],[9,7,12,1]

从这里开始,两边都可以并行排序。如果它们仍然太大,可以再次分割。然而,第二次分割可以并行完成。这将产生以下结果:

[3, 2], [6, 4], [9, 7], [12, 1]

这些都可以并行排序,产生:

[2, 3], [4, 6], [7, 9], [1, 12]

现在我们可以向后工作,并行合并。一个并行合并步骤可以产生:

[2,3,4,6],[1,7,9,12]

从这里开始,只剩下一个合并步骤,无法并行完成:

[1,2,3,4,6,7,9,12]

总体思路是分割输入,直到其大小适合直接处理,然后对其进行排序。合并的作用与拆分相反,并且像拆分一样可以并行完成。

Java 的 Fork/Join Pool特别适合解决这类问题,有一个 tutorial on its usage here.

关于java - 如何使一个简单的函数通过线程运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18385236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com