You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Thread Join与ScheduledExecutorService未按预期工作问题咨询

问题解答

你看到的执行顺序是因为ScheduledExecutorService的scheduleAtFixedRate方法特性导致的:

  • 当thread2执行someMethod时,调用scheduleAtFixedRate仅仅是把someTask提交给调度线程池,这个方法会立即返回,不会等待任务执行甚至启动。
  • 所以someMethod在提交完任务后就执行完毕,thread2的run方法随之结束,此时thread2.join()的等待条件达成,主线程继续执行,打印出after thread2 .....。
  • 调度线程池的线程是独立于thread2的后台线程,它会在任务提交后(延迟0秒)才执行someTask,因此inside someTask......的打印会滞后。

如果想要让thread2等待someTask至少执行一次再结束,可以用同步工具类控制,比如CountDownLatch:

public static synchronized void someMethod() throws InterruptedException {
    System.out.println("inside someMethod...");
    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
    CountDownLatch latch = new CountDownLatch(1);
    Runnable someTask = () -> {
        System.out.println("inside someTask......");
        latch.countDown();
    };
    executor.scheduleAtFixedRate(someTask, 0, 2, TimeUnit.SECONDS);
    // 等待任务至少执行一次
    latch.await();
    // 若不需要后续重复调度,记得关闭线程池避免资源泄漏
    executor.shutdown();
}

另外要注意,默认的调度线程池是后台线程,当主线程结束后,这些后台线程会被终止,如果你需要任务持续执行,还要确保主线程不提前结束。

内容的提问来源于stack exchange,提问作者Shivayan Mukherjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:35:40