我最近一直在处理线程,有点想要一些建议。我将函数代码放在这里只是为了解决任何歧义。
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]);
}
}
这个函数基本上是以一种非常复杂的方式对链表进行排序,但我必须使用这个功能。 这是我想做多线程的功能。但现在我的问题是,你会如何做到这一点,每个线程或多或少相同的工作量?我有点想把数组分成几部分,然后发送每个部分按线程排序?但我不确定这是不是这样做的。正确方向上的任何一点都会很棒。
答案 0 :(得分:1)
拆分数组允许并行排序,并且还允许并行合并。例如,请考虑以下数组:
[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.