有两个线程,线程一的工作任务是计算0-100中偶数的累加和,线程二任务是计算0-100中奇数的累加和,主线程main需要完成0-100的累加和的任务,main中不允许自行计算0-100的累加和,需要合理调用相应功能的线程完成它的任务,用Java代码完成
时间: 2024-10-13 13:05:13 浏览: 26
在Java中,你可以使用`ExecutorService`和`Callable`接口来实现这个需求,因为`Callable`允许异步计算并返回结果。首先,创建两个实现了`Callable<Long>`的类,分别处理偶数和奇数的累加。然后,用`Future`获取计算结果。
```java
import java.util.concurrent.*;
public class SumCalculator implements Callable<Long> {
private final int start;
private final int end;
public SumCalculator(int start, int end) {
this.start = start;
this.end = end;
if (start % 2 == 0) {
// 如果起始值是偶数,那么它应该被包含在内
this.end--;
}
}
@Override
public Long call() throws Exception {
long sum = 0;
for (int i = start; i <= end; i += 2) { // 只对偶数或奇数累加
sum += i;
}
return sum;
}
}
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(2); // 创建一个固定大小的线程池
Future<Long> evenSumTask = executor.submit(new SumCalculator(0, 50)); // 计算0-50的偶数累加和
Future<Long> oddSumTask = executor.submit(new SumCalculator(1, 99)); // 计算0-99的奇数累加和,忽略100
try {
long totalSum = evenSumTask.get() + oddSumTask.get(); // 获取结果并相加
System.out.println("Total sum from 0 to 100 is: " + totalSum);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown(); // 关闭线程池
}
}
}
```
在这个例子中,`main`线程不会直接计算累加和,而是将任务提交给线程池,让每个线程独立地计算它们负责的部分。当所有任务完成后,主线程会合并计算结果。注意,如果想要计算100也被包含在内的奇数和,你需要稍微调整`SumCalculator`类。
阅读全文