先说scheduleWithFixedDelay(),
scheduleWithFixedDelay从字面意义上可以理解为就是以固定延迟(时间)来执行线程任务,它实际上是不管线程任务的执行时间的,每次都要把任务执行完成后再延迟固定时间后再执行下一次。
而scheduleFixedRate呢,是以固定频率来执行线程任务,固定频率的含义就是可能设定的固定时间不足以完成线程任务,但是它不管,达到设定的延迟时间了就要执行下一次了。
不知道大家理解了没有,下面是示例:
- public static void scheduleWithFixedDelay() {
-
- final ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
- // 响铃线程
- final Runnable beeper = new Runnable() {
- public void run() {
- SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- long time = (long) (Math.random() * 1000);
- // 输出线程的名字和使用目标对象及休眠的时间
- System.out.println(sf.format(new Date())+"线程:"+Thread.currentThread().getName()+":Sleeping"+time+"ms");
- try {
- Thread.sleep(time);
- } catch (InterruptedException e) {
- }
- }
- };
- // 设定执行线程计划,初始10s延迟,每次任务完成后延迟10s再执行一次任务
- final ScheduledFuture<?> sFuture=scheduledExecutorService.scheduleWithFixedDelay(beeper,10,10,TimeUnit.SECONDS);
-
- // 40s后取消线程任务
- scheduledExecutorService.schedule(new Runnable() {
- public void run() {
- sFuture.cancel(true);
- scheduledExecutorService.shutdown();
- }
- }, 40, TimeUnit.SECONDS);
-
- }
执行结果:
2013-10-16 10:45:51 线程:pool-1-thread-2:Sleeping 726ms
2013-10-16 10:46:02 线程:pool-1-thread-2:Sleeping 288ms
2013-10-16 10:46:12 线程:pool-1-thread-2:Sleeping 294ms
从执行结果数量看只执行了3次,因为每次要把任务执行完成再执行下一次,导致40s按10s的延迟时间不足以执行4次。
- public static void scheduleAtFixedRate() {
- // 声明线程池
- final ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
- // 响铃线程
- final Runnable beeper = new Runnable() {
- public void run() {
- SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- long time = (long) (Math.random() * 1000);
- // 输出线程的名字和使用目标对象及休眠的时间
- System.out.println(sf.format(new Date()) + " 线程:" + Thread.currentThread().getName() + ":Sleeping " + time + "ms");
- try {
- Thread.sleep(time);
- } catch (InterruptedException e) {
- }
- }
- };
- // 计划响铃,初始延迟10s然后以10s的频率执行响铃
- final ScheduledFuture<?> beeperHandle = scheduledExecutorService.scheduleAtFixedRate(beeper, 10, 10, TimeUnit.SECONDS);
-
- // 取消响铃并关闭线程
- final Runnable cancelBeeper = new Runnable() {
- public void run() {
- System.out.println(Thread.currentThread().getName() + "CANCEL...");
- beeperHandle.cancel(true);
- scheduledExecutorService.shutdown();
- }
- };
- // 60s后执行scheduleAtFixedRate
- scheduledExecutorService.schedule(cancelBeeper, 40, TimeUnit.SECONDS);
- }
执行结果:
2013-10-16 10:16:50 线程:pool-1-thread-1:Sleeping 868ms
2013-10-16 10:17:00 线程:pool-1-thread-1:Sleeping 587ms
2013-10-16 10:17:10 线程:pool-1-thread-1:Sleeping 313ms
2013-10-16 10:17:20 线程:pool-1-thread-1:Sleeping 969ms
pool-1-thread-1CANCEL...
看时间我们就可以知道是每个10s就执行下一次了。
|