当前位置: 首页 > 知识库问答 >
问题:

Executor不返回10个未来对象

万俟旭
2023-03-14

我有一个线程池为10的executor服务,我希望得到10条打印输出语句,它们之间的间隔为3秒,但我只收到一条打印输出语句。我传递了10作为参数,所以我希望运行10个线程。如何检索未来的10个对象?

public class Demo {
    private static final ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main (String[] args) throws ExecutionException, InterruptedException {

        ArrayList futureObjects = new ArrayList();

        Callable<Integer> task = () -> {
            try {
                TimeUnit.SECONDS.sleep(3);
                return 123;
            }
            catch (InterruptedException e) {
                throw new IllegalStateException("task interrupted", e);
            }
        };

        System.out.println("Before execution of threads");

        Future<Integer> future = executor.submit(task);

        Integer result = future.get();
        futureObjects.add(future.get());

        System.out.println("result: " + result);

        for(Object futures : futureObjects ){
            System.out.println("Futures in ArrayList: " + futures);
        }
    }

}

我得到的输出是:

线程执行前

结果:123

ArrayList中的期货:123

共有2个答案

吴宝
2023-03-14

创建的执行器将尝试在10个线程中并行执行任务,但每个提交的任务将只执行一次。

侯和惬
2023-03-14

你实际上只增加了一个任务

您需要同时提交多个任务(使用下面的选项1或选项2),以便实际使用线程池(使线程保持繁忙)。

您可以在下面查看代码的更新版本:

选项(1):ExecutorService-invokeAll():

private static final ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main (String[] args) throws ExecutionException, InterruptedException {

        ArrayList futureObjects = new ArrayList();

        Callable<Integer> task = () -> {
            try {
                TimeUnit.MILLISECONDS.sleep(100);
                return 123;
            }
            catch (InterruptedException e) {
                throw new IllegalStateException("task interrupted", e);
            }
        };

        List<Callable<Integer>> callables = new ArrayList<>();
        callables.add(task);
        callables.add(task);
        callables.add(task);
        callables.add(task);
        //Add other tasks

        System.out.println("Before execution of threads");

        List<Future<Integer>> futures = executor.invokeAll(callables);

        for(Future future : futures ){
            System.out.println("Futures in ArrayList: " + future.get());
        }
    }

选项(2):ExecutorService-提交():

private static final ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main (String[] args) throws ExecutionException, InterruptedException {

        ArrayList futureObjects = new ArrayList();

        Callable<Integer> task = () -> {
            try {
                TimeUnit.MILLISECONDS.sleep(100);
                return 123;
            }
            catch (InterruptedException e) {
                throw new IllegalStateException("task interrupted", e);
            }
        };

        List<Callable<Integer>> callables = new ArrayList<>();
        callables.add(task);
        callables.add(task);
        callables.add(task);
        callables.add(task);
        //Add other tasks

        List<Future<Integer>> futures = new ArrayList<>();
        System.out.println("Before execution of threads");

        for(Callable<Integer> callable : callables) {
            futures.add(executor.submit(callable));
        }

        for(Future future : futures ){
            System.out.println("Futures in ArrayList: " + future.get());
        }
    }

您可以在此处参考API

 类似资料:
  • 我试图异步保存实体并返回结果的未来,但我遇到了以下问题: 测试返回失败,我得到预期结果: 如何将我的存储库实现为异步存储库以及如何测试它? 哪种方法性能更好:1。从存储库2返回未来。是否在ExecutorService中以可调用的方式运行存储库方法?

  • 给定以下使用多线程的Java示例: 它产生: 但应用程序永远不会终止。 我是不是该加入这条线什么的?

  • 问题内容: 我有以下简单的看法。为什么会导致此错误? 问题答案: 因为视图必须 返回 ,而不仅仅是调用它。将最后一行更改为

  • 问题内容: 如果不是原始类型,返回类型的正确方法是什么?例如。我目前使用null如下。 问题答案: Void类是一个无法实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用。 因此,以下任何条件就足够了: 参数化并返回或 参数化并返回 用您的一个参数化 你不能让这种方法,和其他任何回报 的东西 。由于忽略了某些内容,因此您可以返回任何内容。

  • 问题内容: 信封:Akka 2.1,scala版本2.10.M6,JDK 1.7,u5 现在是我的问题:我有: 现在在第一行中,我有一个Future对象的Future,有什么方法可以在不阻塞当前线程的情况下将其转换为Future? Akka有什么方法吗?据我检查,我还没有发现…第一次发帖....不好意思的格式和组织…:〜P 问题答案: 简短答案(英语):flatMap dat sh!t 较短的答案

  • 我使用Windows7和android studio来构建我的应用程序。我在facebook中使用SSO作为登录系统。我遵循以下教程中的步骤。 如何创建Android Facebook密钥哈希? $keytool-exportcert-alias androiddebugkey-keystore“C:\documents and settings\administrator.android\deb