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

线程通常是从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吗?


隔江千里
浏览 149回答 3
3回答

当年话下

有没有办法从 Callable 创建线程?简短回答:不Thread。API 需要一个Runnable不是Callable.您可以使用 a 的Runnable包装器解决此问题Callable,尽管从 中获取结果Callable有点麻烦!一个更好的主意是使用ExecutorService.&nbsp;这使您可以避免不创建太多线程和(或者)管理自己的线程池的问题。注意到您的示例并不真正需要Callable.&nbsp;您正在返回构造函数Set中提供的a&nbsp;AddNumImmediately。调用者可以简单地保留对该Set对象的引用。

呼唤远方

您不能从 callable 创建新线程。就在那里。对于一个新线程,线程必须出现。据说您可以将 FurtureTask 与 callable 和 Thread 一起使用来获取结果。你可以尝试这样的事情:FutureTask<String> f1 = new FutureTask<String>(new Callable<String>() {&nbsp; &nbsp; public String call() throws InterruptedException {&nbsp; &nbsp; &nbsp; &nbsp; Thread.sleep(1000);&nbsp; &nbsp; &nbsp; &nbsp; return "A constant from " + Thread.currentThread().getName();&nbsp; &nbsp; }});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 的常量得到了
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java