3、新建2个线程thread1, thread2。其中:thread1 采用 ThreadPoolExecutor ,thread2采用Executors工具类实现,第一个thread1线程实现功能 求和 1+2!+3!+4!+…+8!. 第二个thread2线程实现功能 找出前1000位数中所有的完数,完数如果一个数恰好等于它的真因子之和,则称该数为“完全数”,例如:6=3+2+1;
时间: 2024-01-03 15:04:09 浏览: 114
好的,您的问题我已经记下了。下面是代码实现:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class Test {
public static void main(String[] args) {
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(2);
// 创建 Callable 实例
Callable<Integer> task1 = () -> {
int sum = 0;
for (int i = 1; i <= 8; i++) {
sum += factorial(i);
}
return sum;
};
Callable<List<Integer>> task2 = () -> {
List<Integer> perfectNumbers = new ArrayList<>();
for (int i = 1; i <= 1000; i++) {
if (isPerfectNumber(i)) {
perfectNumbers.add(i);
}
}
return perfectNumbers;
};
// 提交任务并获取 Future 实例
Future<Integer> future1 = ((ThreadPoolExecutor) executorService).submit(task1);
Future<List<Integer>> future2 = executorService.submit(task2);
// 等待任务执行完成并获取结果
try {
int sum = future1.get();
System.out.println("求和结果:" + sum);
List<Integer> perfectNumbers = future2.get();
System.out.println("完全数:");
for (int perfectNumber : perfectNumbers) {
System.out.println(perfectNumber);
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
// 关闭线程池
executorService.shutdown();
}
// 计算阶乘
private static int factorial(int n) {
int result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
// 判断是否为完全数
private static boolean isPerfectNumber(int n) {
int sum = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) {
sum += i;
}
}
return sum == n;
}
}
```
上面的代码中,我们创建了一个固定大小为 2 的线程池。然后创建了两个 `Callable` 实例,一个用于求和,一个用于找出前 1000 个完全数。然后我们通过线程池的 `submit` 方法将任务提交给线程池,并获取了两个 `Future` 实例。最后,我们通过 `get` 方法等待任务执行完成并获取结果。注意,我们需要捕获 `InterruptedException` 和 `ExecutionException` 异常。
`factorial` 方法用于计算阶乘,`isPerfectNumber` 方法用于判断一个数是否为完全数。
阅读全文