为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

隔江千里 2021-09-12 15:44:12
线程通常是从Runnables创建的。有没有办法从 a 创建线程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);}我知道Callables 可以由 an 运行Executor,但是有可能以某种方式运行它们Thread吗?
查看完整描述

3 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

有没有办法从 Callable 创建线程?

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

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

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


查看完整回答
反对 回复 2021-09-12
?
呼唤远方

TA贡献1856条经验 获得超11个赞

您不能从 callable 创建新线程。就在那里。对于一个新线程,线程必须出现。据说您可以将 FurtureTask 与 callable 和 Thread 一起使用来获取结果。你可以尝试这样的事情:


FutureTask<String> f1 = new FutureTask<String>(new Callable<String>() {

    public String call() throws InterruptedException {

        Thread.sleep(1000);

        return "A constant from " + Thread.currentThread().getName();

    }

});


Thread t = new Thread(f1);

t.start();

System.out.println("Calling Get " + Thread.currentThread().getName());

System.out.println(f1.get());

System.out.println("Got Get");

会给你输出:


调用获取主


来自 Thread-0 的常量


得到了


查看完整回答
反对 回复 2021-09-12
  • 3 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信