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
相关产品推荐
相关产品推荐

