我需要一个可以运行的完整代码,问题是分成6个线程,计算m到n的值(以1到100000000为例)的总和。要求使用Executors框架,每个线程计算的数字量之差不超过1
时间: 2024-05-08 15:17:28 浏览: 13
以下是一个可以运行的Java代码,使用了Executors框架,将计算任务分成6个线程,每个线程计算的数字量之差不超过1,最终将结果累加得到总和。
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class SumCalculator {
private static final int THREAD_COUNT = 6;
private static final long START_NUMBER = 1;
private static final long END_NUMBER = 100000000;
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
long batchSize = (END_NUMBER - START_NUMBER + 1) / THREAD_COUNT;
long remainder = (END_NUMBER - START_NUMBER + 1) % THREAD_COUNT;
long currentNumber = START_NUMBER;
long sum = 0;
for (int i = 0; i < THREAD_COUNT; i++) {
long batchSizeForThread = batchSize + (i < remainder ? 1 : 0);
executor.submit(new SumCalculatorTask(currentNumber, currentNumber + batchSizeForThread - 1));
currentNumber += batchSizeForThread;
}
executor.shutdown();
executor.awaitTermination(1, TimeUnit.MINUTES);
sum = SumCalculatorTask.getSum();
System.out.println("Sum of " + START_NUMBER + " to " + END_NUMBER + " is: " + sum);
}
private static class SumCalculatorTask implements Runnable {
private final long startNumber;
private final long endNumber;
private static volatile long sum = 0;
public SumCalculatorTask(long startNumber, long endNumber) {
this.startNumber = startNumber;
this.endNumber = endNumber;
}
@Override
public void run() {
long localSum = 0;
for (long i = startNumber; i <= endNumber; i++) {
localSum += i;
}
sum += localSum;
}
public static long getSum() {
return sum;
}
}
}
```
代码中首先定义了线程数量和计算的起始和结束数字,然后创建了一个固定线程数的线程池,并根据线程数量和计算范围计算出每个线程需要处理的数字数量。接着通过循环创建多个线程,并将计算任务分配给它们处理。最后等待所有线程完成任务,获取每个线程的计算结果并将它们累加得到最终的总和。