通过多线程添加数组的元素

时间:2012-02-24 02:46:36

标签: java multithreading

在我继续前进之前,这是我的功课。但是,我遇到麻烦的部分不是作业的主要内容。

对于赋值,我们只是将数字存储在数组中,并通过多线程将数组的元素相加。

用户输入他们想要运行的线程数,以及上限应该是多少。

例如:  上界:12  主题:2  应用程序应该添加元素1-6,然后是7-12。  在这种情况下,下限从1开始,上限从6开始。然后第二次循环应该迭代上限应为7,上限应为12。

我无法尝试将上限除以线程数来创建增量,其中下限和上限基于。

如果线程数均匀分配到起始上限,则相当简单。但是当我遇到问题的时候不是。

2 个答案:

答案 0 :(得分:3)

界限:18,主题:7

使用除法来计算每个线程的标称元素数量: 每线程的行程数= 18/7

使用模运算符来计算应该获得一个额外元素的线程数(对于余数): 一个额外的线程= 18%7

答案 1 :(得分:1)

这可能有点超出了你的任务要求你做的界限(不确定你的意思)。但这是一个非常基本的例子,说明如何使用固定的线程池解决这个问题。节省您自己管理线程的麻烦。你的#threads将是fixedThreadPool的大小。然后你可以创建添加两个数字的“工作”。如果您有一个奇数上限,在这里只需添加最后一个数字。

    private static ExecutorService tpool = Executors.newFixedThreadPool(20);
    private static final int upper = 140;

    private static AtomicInteger total = new AtomicInteger(0);

public static void main(String[] args) throws Exception {

    int ar[] = new int[upper];
    for(int i = 1 ; i <= upper; i++){
        ar[i-1]=i;
    }

    for(int i = 1 ; i <= ((upper%2) !=0 ? (upper-1):(upper)); i+=2){
        final int a = ar[i-1];
        final int b = ar[i];
            Thread thread = new Thread(new Runnable(){
                public void run() {
                    int res = add(a, b);
                    total.addAndGet(res);
                    return;
            }});
            tpool.execute(thread);
    }
    if(upper%2!=0)
        total.addAndGet(ar[ar.length-1]);

    tpool.shutdown(); //wait for everything to finish
    System.out.println(total.get()); //get the result.
}

private static int add(final int a, final int b){
    return a+b;
}

可以说,如果你有两个线程读取数组的块,那么效率会降低,因为你会告诉线程1添加1-6而线程2添加7-12。但它基本上做同样的事情,这种方法非常适合计算密集型任务。