java - ScheduledExecutorService 多线程并行

标签 java multithreading executorservice executor

我有兴趣使用 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.scheduleWithFixedDelay 很清楚 - 它执行任务之间的时间跨度相同,完成任务需要多长时间并不重要。所以我可能误解了 ScheduledExecutorService 的目的。

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

最佳答案

我已经通过在每个计划执行中启动一个嵌套的匿名 runnable 解决了这个问题:

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,那么主可运行对象的执行速度可能也会变得太慢。

关于java - ScheduledExecutorService 多线程并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6846774/

相关文章:

java - JPA 1 不够好

c# - WPF:如何在 UI 线程中进行异步调用

objective-c - 在附加到 NSOperationQueue operationsCount 的 observeValueForKeyPath 中崩溃

java - 控制ExecutorService每秒最多执行N个任务

java - 使用 SwingWorker 可运行对象从 ExecutorService 获取正确类型的 Future

java - 天空盒是全黑的

java - 内联类在 openJdk 上生成奇怪的名字

java - 删除角 View TableView

multithreading - 当线程消耗大量CPU时,如何打印线程的执行堆栈?

java - 使用 ExecutorService 时出现超时问题