1

我只是在解决这个问题时遇到了一些问题。任何帮助将不胜感激。

该程序必须读取一个文本文件,它将计算每个输入数字的除数之和。例如,数字 20 的和为 1+2+4+5+10=22。然后将这些总和逐行相加。然后找到除数之上的这些总和中的每一个,然后最后将它们相加。

例如初始文件 1 2 4 6 15 20

25 50 100 125 250 500

16 8 3

然后计算除数之和。

1 1 3 6 9 22

6 43 117 31 218 592

15 7 1

一行一行总结

42

1007

23

然后计算上述总和。

54

73

1

然后终于凑齐回来了。

128

我需要通过线程池完成每一行来完成该过程。

我的逻辑如下。

              5.2. For each input line (Add each line to an ArrayBlockingQueue, 
Then add each item in the Queue to an ExecutorService Which will run the follow)   

               5.2.1. Parse the current input line into integers 

               5.2.2. For each integer in the current input line 

                   5.2.2.1. Compute the sum-of-divisors of this integer 

                   5.2.2.2. Add this to the cumulated sum-of-divisors 

               5.2.3. Compute the sum-of-divisors of this cumulated sum

               5.2.4. Add this to the grand total

我在 5.2 之后卡住了,我是创建一个实现可运行接口的新类,然后将累积总和添加到 atomicArray,还是最好创建一个实现可调用接口的类,然后让它返回累积总和?还是有完全不同的方式。

到目前为止,这是我所拥有的,它返回了所需的结果,但是是按顺序进行的。

http://pastebin.com/AyB58fpr

4

2 回答 2

1

利用

java.util.concurrent.Future

和一个

java.util.concurrent.Executors.newFixedThreadPool(int nThreads)

这将很容易做到。

如果您不熟悉 Executors,请遵循Oracle 教程。

于 2012-05-09T08:38:57.520 回答
1

我更喜欢这个Callable接口,因为它不会创建处理输入的代码对如何收集输出的依赖。

通常的方法是将任务收集到一个Futures 列表中。有关示例,请参见此答案。

于 2012-05-09T08:39:31.867 回答