How to stop a task in ScheduledThreadPoolExecutor once I think it's completed

后端 未结 3 1051
说谎
说谎 2020-12-28 15:05

I have a ScheduledThreadPoolExecutor with which I schedule a task to run at a fixed rate. I want the task to be running with a specified delay for a maximum of say 10 times

3条回答
  •  抹茶落季
    2020-12-28 15:33

    CountDownLatch is an alternative approach. When the thread completes, call countDown() on the latch. The calling thread calls latch.await() until all threads complete. At that point call ExecutorService.shutdownNow() so that your main thread doesn't turn into a zombie.

    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    public class ScheduledThreadPoolExecutorTest {
    
      static int i = 0;
    
      public static void main(String[] args) throws Exception {
        final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
        final CountDownLatch latch = new CountDownLatch(1);
        executor.scheduleAtFixedRate(() -> {
            System.out.println(++i);
            if (i > 4) {
              latch.countDown();
            }
        }, 0, 100, TimeUnit.MILLISECONDS);
        latch.await();
        executor.shutdownNow();
      }
    }
    

提交回复
热议问题