線程池(5)Executors.newScheduledThreadPool
阿新 • • 發佈:2018-09-07
ice trac executor log lis class try 例子 eat
例子1(scheduleAtFixedRate):延遲2秒後,每隔3秒執行1次
ScheduledExecutorService es = Executors.newScheduledThreadPool(5); log.info("開始時間"); Runnable syncRunnable = new Runnable() { @Override public void run() { log.info(Thread.currentThread().getName()); } }; es.scheduleAtFixedRate(syncRunnable,2000, 3000, TimeUnit.MILLISECONDS);
運行結果:
10:49:22.495 開始時間
10:49:24.500 pool-1-thread-1
10:49:27.499 pool-1-thread-1
10:49:30.500 pool-1-thread-2
10:49:33.500 pool-1-thread-1
10:49:36.501 pool-1-thread-3
10:49:39.500 pool-1-thread-2
10:49:42.500 pool-1-thread-2
10:49:45.500 pool-1-thread-1
10:49:48.501 pool-1-thread-1
10:49:51.501 pool-1-thread-1
10:49:54.501 pool-1-thread-4
10:49:57.501 pool-1-thread-2
10:50:00.502 pool-1-thread-2
10:50:03.502 pool-1-thread-3
10:50:06.502 pool-1-thread-3
10:50:09.502 pool-1-thread-3
10:50:12.503 pool-1-thread-5
10:50:15.503 pool-1-thread-5
10:50:18.503 pool-1-thread-5
10:50:21.503 pool-1-thread-5
10:50:24.503 pool-1-thread-3
10:50:27.503 pool-1-thread-2
10:50:30.503 pool-1-thread-1
10:50:33.504 pool-1-thread-4
10:50:36.504 pool-1-thread-5
10:50:39.504 pool-1-thread-5
10:50:42.504 pool-1-thread-2
例子2(scheduleWithFixedDelay):延遲5秒後,每個任務執行完後延遲3秒在執行1次
ScheduledExecutorService es = Executors.newScheduledThreadPool(5); log.info("開始時間"); Runnable syncRunnable = new Runnable() { @Override public void run() { log.info(Thread.currentThread().getName());try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }; es.scheduleWithFixedDelay(syncRunnable, 5000, 3000, TimeUnit.MILLISECONDS);
運行結果:
11:10:27.773 開始時間
11:10:32.778 pool-1-thread-1
11:10:36.779 pool-1-thread-1
11:10:40.780 pool-1-thread-2
11:10:44.781 pool-1-thread-1
11:10:48.783 pool-1-thread-3
11:10:52.785 pool-1-thread-3
11:10:56.785 pool-1-thread-4
11:11:00.787 pool-1-thread-4
11:11:04.788 pool-1-thread-4
11:11:08.789 pool-1-thread-4
11:11:12.790 pool-1-thread-3
11:11:16.792 pool-1-thread-1
本來是每隔3秒執行的,但是,由於某個任務處理時間過長,導致延後。本例是延後1秒,即4秒。
總結:scheduleAtFixedRate與scheduleWithFixedDelay區別
scheduleAtFixedRate:不管任務是否執行完了,在3秒內必須執行
scheduleWithFixedDelay:等任務執行完了,在等3秒後執行
因此,scheduleWithFixedDelay 非常有用。
線程池(5)Executors.newScheduledThreadPool