gpt4 book ai didi

java - 来自 Callable 而不是 Runnable 的新线程?

转载 作者:行者123 更新时间:2023-11-29 08:26:35 24 4
gpt4 key购买 nike

线程通常是从 Runnable 创建的。有没有办法从 Callable 创建线程?

public class AddNumImmediately implements Callable {
private int minRange;
private int maxRange;
private Set<Integer> primeNumberList;
private int step;

public AddNumImmediately(int minRange, int maxRange, Set<Integer> primeNumberList, int step) {
this.minRange = minRange;
this.maxRange = maxRange;
this.primeNumberList = primeNumberList;
this.step = step;
}

@Override
public Object call() {
for (int i = minRange; i <= maxRange; i += step) {
if (PrimeChecker.isPrimeNumber(i)) {
primeNumberList.add(i);
}
}
return primeNumberList;
}
}

然后我尝试通过线程运行我的 Callable:

public void setup(int min, int max, int threadNumber) throws InterruptedException {
Set<Integer> primeNumberList = new LinkedHashSet<>();
List<Thread> threadList = new ArrayList<>();

for (int i = 0; i < threadNumber; i++) {
threadList.add(new Thread(String.valueOf(new AddNumImmediately(min, max, primeNumberList, threadNumber))));
}
for (Thread thread : threadList) {
thread.start();
}

for (Thread thread : threadList) {
thread.join();
}
System.out.println(primeNumberList);
}

我知道 Callable 可以由 Executor 运行,但是是否有可能以某种方式通过 Thread 运行它们?

最佳答案

Is there a way to create a thread from a Callable?

简短回答:否。Thread API 需要一个Runnable 而不是一个Callable

虽然从 Callable 获取结果有点困惑,但您可以使用 Runnable 包装器来解决这个问题!一个更好的主意是使用 ExecutorService。这使您可以避免不创建太多线程和(或者)管理您自己的线程池的问题。

请注意,您的示例实际上并不需要 Callable。您正在返回 AddNumImmediately 构造函数中提供的 Set。调用者可以简单地保留对该 Set 对象的引用。

关于java - 来自 Callable 而不是 Runnable 的新线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52258277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com