如何使用线程运行简单的函数

时间:2013-08-22 15:47:55

标签: java multithreading function

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

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]);
    }


}

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

1 个答案:

答案 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.