有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java根据条件向ExecutorService动态提交任务

我目前正在使用带有固定线程池的ExecutorServices并提交3个任务

ExecutorService executorService = Executors.newFixedThreadPool(3);

Future<Object1> = executorService.submit(task1);

Future<Object2> = executorService.submit(task2);

Future<Object3> = executorService.submit(task3);

executorService.shutdown();

executorService.awaitTermination(10000, TimeUnit.MILLISECONDS)

现在它工作得很好,因为我总是需要执行所有这些服务,但是现在我想定制它。 例如,我可能只需要运行服务1、服务2、服务3或它们的任意组合或所有组合

如何自定义要提交执行的所有服务以及线程池大小

我不想做令人毛骨悚然的if检查来检查服务1是否需要等


共 (2) 个答案

  1. # 1 楼答案

    这是否满足您的要求:

    List<Runnable> servicesToRun = new ArrayList<>();
    ExecutorService executorService = Executors.newFixedThreadPool(servicesToRun.size());
    servicesToRun.stream().forEach(executorService::submit);
    

    然后,根据应用程序逻辑,只需确保名为ListservicesToRun包含要运行的服务

  2. # 2 楼答案

    我认为您需要做的是抽象出对ExecutorService的访问,并传入您希望它动态处理的任务

    请注意,我在这里没有做出任何履约保证或承诺;这是一个概念,人们至少应该按照这个概念来思考

    如果我确信每次都要拆除线程池,我可以动态地将线程池的大小设置为传入的任务的大小

    public void executeTasks(Callable<?>... tasks) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(tasks.length);
        for(Callable<?> task : tasks) {
            executorService.submit(task);
        }
    
        executorService.shutdown();
        executorService.awaitTermination(10000, TimeUnit.MILLISECONDS);
    }
    

    如果您处理InterruptedException,您可以这样调用它:

    obj.executeTaks(future1, future3);