关于ScheduledExecutorService执行一段时间之后就不执行的问题

原创 2015年07月08日 20:42:04

问题背景

最近写了个程序,程序中使用到了ScheduledExecutorService的scheduleAtFixedRate方法,用于定时执行任务,但是发现程序运行一段时间之后定时任务不执行了,查看日志和perfcounter都没有看到任何异常,比较郁闷。最后看了一下JDK的源码,在源码的Java doc中的发现了如下一句话:

If any execution of the task encounters an exception, subsequent executions are suppressed.Otherwise, the task will only terminate via cancellation or termination of the executor.

简单总结就是:如果定时任务执行过程中遇到发生异常,则后面的任务将不再执行。

代码实验

我们可以做个实验验证一下:
先看下面一段代码:

/**

 *  [Copyright]
 *  @author  QiFuguang 
 *  Aug 25, 2014 9:48:41 PM 
 */

package com.winwill.xx;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Test {
    private final static ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

    public static void main(String[] args) {
        scheduler.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                int[] s = new int[1];
                System.out.println("OK");
                System.out.println(s[1]);  // 数组越界
            }
        }, 0, 2, TimeUnit.SECONDS);
    }
}

这段代码的执行效果如下:

OK

可以看到定时任务只执行了一次,因为第一次执行就遇到了数组越界异常,后面的任务被取消了。

再看如下代码:

/**

 *  [Copyright]
 *  @author  QiFuguang 
 *  Aug 25, 2014 9:48:41 PM 
 */

package com.winwill.xx;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Test {
    private final static ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

    public static void main(String[] args) {
        scheduler.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                try {
                    int[] s = new int[1];
                    System.out.println("OK");
                    System.out.println(s[1]); // 数组越界
                } catch (Throwable t) {
                    System.out.println("Error");
                }

            }
        }, 0, 2, TimeUnit.SECONDS);
    }
}

运行效果如下:

OK
Error
OK
Error
OK
Error
OK
Error

加了try/catch之后可以看到定时任务没有被取消。

希望对各位读者有用。cc

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ScheduledExecutorService定时周期执行指定的任务

一:简单说明 ScheduleExecutorService接口中有四个重要的方法,其中scheduleAtFixedRate和scheduleWithFixedDelay在实现定时程序时比较方便。...

Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代

继续并发,上篇博客对于ScheduledThreadPoolExecutor没有进行介绍,说过会和Timer一直单独写一篇Blog. 1、Timer管理延时任务的缺陷 a、以前在项目中也经常使用定时器...

关于ScheduledExecutorService执行一段时间之后就不执行的问

最近写了个程序,程序中使用到了ScheduledExecutorService的scheduleAtFixedRate方法,用于定时执行任务,但是发现程序运行一段时间之后定时任务不执行了,查看日志和p...

scheduleAtFixedRate定时任务超时问题

若任务处理时长超出设置的定时频率时长,本次任务执行完才开始下次任务,下次任务已经处于超时状态,会马上开始执行. 若任务处理时长小于定时频率时长,任务执行完后,定时器等待,下次任务会在定时器等待频率时长...

@Scheduled不执行的原因

1. 今天用@Schedule做了一个定时任务,希望凌晨1点执行,代码如下@Service public class ParseJsonService { @Scheduled(cron =...

spring定时任务配置,以及不执行的解决办法

前几天,同事问了我一个问题,我告诉他用spring的定时任务解决,并给他配置了spring的定时任务。当时随便找了一个bean写了一段代码,验证定时任务正确执行后,就没再管,昨天下午,同事写代码的时候...
  • lxl631
  • lxl631
  • 2014年03月26日 09:38
  • 13552

ScheduledExecutorService遇到异常后续任务不继续执行的问题

最近写了个程序,程序中使用到了ScheduledExecutorService的scheduleAtFixedRate方法,用于定时执行任务,但是发现程序运行一段时间之后定时任务不执行了,查看日志和p...

ScheduledExecutorService中scheduleAtFixedRate方法的同步

因为scheduleAtFixedRate是指定频率执行方法,若方法的执行时间大于指定的间隔时间,将会发生,同一时间点 ,执行方法N 次。 所以需要使用同步方法才确保并发操作的安全性。 impor...

ScheduledExecutorService只执行一段时间

写项目的时候,用了线程池ScheduledExecutorService.scheduleAtFixedRate(...)发现只执行了一次,后来经过仔细查看,发现中Runable任务中发生了异常,所以...

记录ScheduledExecutorService使用中不工作情况

由于本博客存在一个自己的IP统计功能,使用了淘宝API查询IP的归属地,由于淘宝API查询IP归属地存在访问速度限制问题,导致本博客在插入用户记录的时候查询归属地特别的慢,所有考虑使用多线程去处理,但...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于ScheduledExecutorService执行一段时间之后就不执行的问题
举报原因:
原因补充:

(最多只允许输入30个字)