【问题标题】:ScheduledExecutorService multiple threads in parallelScheduledExecutorService 多线程并行
【发布时间】:2011-10-14 09:02:35
【问题描述】:

如果之前的任务尚未完成,我有兴趣使用ScheduledExecutorService 为任务生成多个线程。例如,我需要每 0.5 秒处理一次文件。第一个任务开始处理文件,如果第一个线程未完成,则在 0.5 秒后生成第二个线程并开始处理第二个文件,依此类推。这可以通过以下方式完成:

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(4)
    while (!executor.isShutdown()) {  
        executor.execute(task);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            // handle
        }
    }

现在我的问题是:为什么我不能使用executor.scheduleAtFixedRate

我得到的是,如果第一个任务需要更长的时间,第二个任务会在第一次完成后立即启动,但即使 executor 有线程池,也不会启动新线程。 executor.scheduleWithFixedDelay 很清楚 - 它以相同的时间跨度执行任务,完成任务需要多长时间并不重要。所以可能我误解了ScheduledExecutorService 的目的。

也许我应该看看另一种执行者?或者只是使用我在这里发布的代码?有什么想法吗?

【问题讨论】:

    标签: java multithreading executorservice executor


    【解决方案1】:

    scheduleAtFixedRate 方法之一就是您正在寻找的。它以给定的时间间隔从池中的线程中启动一个任务,即使以前的任务还没有完成。如果执行处理的线程用完了,请按照ThreadPoolExecutor docs 中的详细说明调整池大小限制。

    【讨论】:

    • 您链接到 scheduleAtFixedRate 方法,javadoc 指出:“如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。”这正是我尝试时的工作原理...... scheduleWithFixedDelay 也不适合,因为它在第一个任务结束后开始计算延迟。线程池有多大并不重要。这对我来说很奇怪 ScheduledExecutorService 没有并行执行的方法,或者我错过或误解了某些东西,这就是我问的原因:)
    • 哦,我明白了。我错过了。我想问题是,“如果你想一次执行其中两个,它们真的是同一个任务吗?”如果您确信它们是,那么我认为 java.util.concurrent 可能不支持该特定用法。
    【解决方案2】:

    我已通过在每个计划执行中启动嵌套匿名可运行对象来解决该问题:

    final ScheduledExecutorService service = Executors.newScheduledThreadPool(POOL_SIZE);
    
    final Runnable command = new SlowRunnable();
    
    service.scheduleAtFixedRate(
        new Runnable() {
          @Override
          public void run() {
            service.execute(command);
          }
        }, 0, 1, TimeUnit.SECONDS);
    

    在这个例子中,每个间隔都会有 1 个线程执行一条快速指令,所以当下一个间隔到期时,它肯定会完成。剩余的 POOL_SIZE-1 线程将并行执行 SlowRunnable 的 run(),这可能需要比单个间隔的持续时间更长的时间。

    请注意,虽然我喜欢这个解决方案,因为它可以最小化代码并重用相同的 ScheduledExecutorService,但它必须正确调整大小并且可能无法在所有情况下使用:如果 SlowRunnable 太慢以至于最多 POOL_SIZE 作业一起执行,将没有线程及时运行计划任务。

    此外,如果您将时间间隔设置为 1 TimeUnit.NANOSECONDS,那么主可运行文件的执行也可能会变得太慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      相关资源
      最近更新 更多