IResource()接口用于实现并行计算的示例代码
发布时间:2023-12-29 14:05:26
IResource()接口用于实现并行计算的示例代码,以下是一个使用例子:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class ParallelCalculator implements IResource<Double> {
private List<Double> inputList;
private int numThreads;
public ParallelCalculator(List<Double> inputList, int numThreads) {
this.inputList = inputList;
this.numThreads = numThreads;
}
public Double calculate() {
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
List<Future<Double>> taskList = new ArrayList<>();
int batchSize = inputList.size() / numThreads;
int remainder = inputList.size() % numThreads;
for (int i = 0; i < numThreads; i++) {
int start = i * batchSize;
int end = start + batchSize;
if (remainder > 0 && i == numThreads - 1) {
// Add the remaining elements to the last thread
end += remainder;
}
List<Double> subList = inputList.subList(start, end);
Callable<Double> task = new CalculateTask(subList);
Future<Double> futureTask = executor.submit(task);
taskList.add(futureTask);
}
Double result = 0.0;
for (Future<Double> futureTask : taskList) {
try {
result += futureTask.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
executor.shutdown();
return result;
}
private static class CalculateTask implements Callable<Double> {
private List<Double> inputList;
public CalculateTask(List<Double> inputList) {
this.inputList = inputList;
}
@Override
public Double call() {
Double sum = 0.0;
for (Double num : inputList) {
// Perform some computation on the input list
sum += num;
}
return sum;
}
}
public static void main(String[] args) {
List<Double> inputList = new ArrayList<>();
for (int i = 1; i <= 1000; i++) {
inputList.add((double) i);
}
int numThreads = 4;
ParallelCalculator calculator = new ParallelCalculator(inputList, numThreads);
Double result = calculator.calculate();
System.out.println("Result: " + result);
}
}
在上述代码中,我们首先定义了一个ParallelCalculator类,实现了IResource接口,该接口用于并行计算。在类的构造函数中,我们传入了一个输入列表和要使用的线程数。
在calculate方法中,我们首先创建一个固定大小的线程池,然后将输入列表分割为与线程数相等的子列表。我们使用Callable接口的实现类CalculateTask对这些子列表进行计算。每个子列表的计算任务都将被提交到线程池中,并返回一个Future对象,以便获取计算结果。
然后,我们遍历taskList中的Future对象,使用get方法获取每个任务的计算结果,并将结果累加到最终的结果中。
最后,我们关闭线程池并返回结果。
在CalculateTask类中,我们实现了Callable接口,定义了每个子列表的计算任务。在call方法中,我们遍历子列表中的元素,并执行一些计算。在这个例子中,我们仅仅将子列表中的所有元素相加,但实际上你可以根据自己的需求在这里进行任意计算。
在main方法中,我们创建一个包含1000个元素的输入列表,并将其传递给ParallelCalculator类的实例,同时指定要使用的线程数为4。然后调用calculate方法进行并行计算,并打印计算结果。
这个示例代码展示了如何使用IResource接口实现并行计算,并在主程序中进行了简单的输入列表求和计算。实际上,你可以根据自己的需求修改CalculateTask类中的计算逻辑,并使用IResource接口在更复杂的计算场景下实现并行计算。
