`
m635674608
  • 浏览: 5043425 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

    博客分类:
  • java
 
阅读更多
最近写了个程序,程序中使用到了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;

publicclassTest{
privatefinalstaticScheduledExecutorService scheduler =Executors.newSingleThreadScheduledExecutor();

publicstaticvoid main(String[] args){
scheduler.scheduleAtFixedRate(newRunnable(){
@Override
publicvoid run(){
int[] s =newint[1];
System.out.println("OK");
System.out.println(s[1]);// 数组越界
}
},0,2,TimeUnit.SECONDS);
}
}

这段代码的执行效果如下:
关于ScheduledExecutorService执行一段时间之后不在执行的问题 - 黯然神伤 - WinWill2014
 可以看到定时任务只执行了一次,因为第一次执行就遇到了数组越界异常,后面的任务被取消了。

再看如下代码:

/**

* [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;

publicclassTest{
privatefinalstaticScheduledExecutorService scheduler =Executors.newSingleThreadScheduledExecutor();

publicstaticvoid main(String[] args){
scheduler.scheduleAtFixedRate(newRunnable(){
@Override
publicvoid run(){
try{
int[] s =newint[1];
System.out.println("OK");
System.out.println(s[1]);// 数组越界
}catch(Throwable t){
System.out.println("Error");
}

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

运行效果如下:
关于ScheduledExecutorService执行一段时间之后不在执行的问题 - 黯然神伤 - WinWill2014
加了try/catch之后可以看到定时任务没有被取消。
 
http://blog.163.com/scuqifuguang@126/blog/static/1713700862014728114521780/
分享到:
评论

相关推荐

    ScheduledExecutorService任务定时代码示例

    ScheduledExecutorService 可以用来实现各种定时任务,如每天某个时间执行某个任务、每隔一段时间执行某个任务等。 ScheduledExecutorService 的实现 在上面的示例代码中,我们使用了 Executors....

    直行一个操作,2秒后执行另一个操作

    在主线程上执行的操作如果需要等待一段时间后再进行其他操作,通常会使用定时器或线程睡眠(Thread.sleep())来实现。然而,`Thread.sleep()`方法会使当前线程暂停执行指定的毫秒数,释放CPU资源,但不会释放锁或...

    java 定时执行任务

    // 设置在5秒后执行第一次,然后每隔2秒执行一次 timer.schedule(task, 5000, 2000); } } ``` 在这个例子中,`TimerTaskDemo`是我们的自定义任务,`run()`方法包含需要定时执行的代码。`schedule()`方法用于安排...

    java定时执行代码.

    - `schedule(Runnable command, long delay, TimeUnit unit)`: 延迟一段时间后执行一次任务。 - `scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)`: 以固定速率重复执行...

    Android定时器实现定时执行、重复执行、定时重复执行、定次数执行的多种方式

    Android定时器实现定时执行、重复执行、定时重复执行、定次数执行的多种方式 Android平台中,定时器是实现定时执行、重复执行、定时重复执行、定次数执行等功能的重要组件。下面将详细介绍Android定时器实现定时...

    精确的控制时间间隔Timer

    `Timer`类在许多编程语言中都有实现,如Java、C#等,它用于执行预定的任务,例如定时触发某些操作或者按照特定的时间间隔重复执行某段代码。然而,由于系统调度、线程上下文切换和其他系统级因素的影响,`Timer`的...

    JAVA并发编程实践-线程执行-学习笔记

    线程一旦被调度,会在运行一段时间后被强制暂停,让其他线程有机会执行。这种方式有助于避免单个线程长时间占用资源,从而确保系统的公平性和响应性。 协同式线程调度则不同,它依赖于线程的协作。线程自行决定何时...

    TimerTask与Timer设计时间监控

    前者会在指定延迟后执行任务,而后者则会在指定的日期和时间首次执行,然后每隔一段时间重复执行。 `TimerTask`是`Runnable`接口的子类,代表一个可被定时执行的任务。开发者需要继承`TimerTask`并重写其`run()`...

    计算机软件-商业源码-时间锁源代码.zip

    时间锁是一种在软件开发中常见的技术,它用于控制程序中某些功能或操作的执行时机,确保在特定时间点之前或之后才能执行。在"计算机软件-商业源码-时间锁源代码.zip"这个压缩包中,我们能够深入研究这种技术的实现...

    java线程定时启动

    在Java编程中,有时我们需要让某个任务或操作在特定的时间点或每隔一段时间自动执行一次。这通常被称为“定时任务”。Java标准库提供了几种不同的方式来实现定时任务的功能,其中最常用的是`java.util.Timer`类与`...

    java中的定时器,定时访问某程序等

    1. `schedule(TimerTask task, long delay)`:此方法会在延迟指定的毫秒数后执行一次任务。 2. `scheduleAtFixedRate(TimerTask task, long initialDelay, long period)`:这个方法会周期性地执行任务,首次执行在...

    Java定时器Timer简述共8页.pdf.zip

    在Java编程中,我们有时需要在特定的时间间隔内执行某些操作,例如每隔一段时间更新数据、发送通知或者执行定期维护等。这就是Java定时器(Timer)的作用所在。 Timer类提供了计划执行的任务(TimerTask)的能力,...

    java 实现调度器

    Timer可以安排一次性任务(即只执行一次的任务)或者周期性任务(定期执行的任务)。以下是如何使用Timer的基本示例: ```java import java.util.Timer; import java.util.TimerTask; public class TimerExample {...

    JAVA定时器

    创建一个`Timer`实例后,可以调用`schedule(TimerTask task, long delay)`方法来延迟一段时间后执行任务,或者`schedule(TimerTask task, Date firstTime, long period)`来定期执行任务。然而,`Timer`类的线程模型...

    TimerDemo_時間測試_源码

    - 时间测试还可能涉及到多线程或多进程环境下的时间同步和调度问题,比如Java的`ScheduledExecutorService`可以安排定时任务。 - 在并发环境下,正确地测量和比较任务执行时间需要考虑锁和其他同步机制的影响。 6...

    Java定时任务

    例如,每天凌晨自动清理过期的用户数据,或者每隔一段时间检查服务器性能并记录日志。 7. **扩展:Quartz Scheduler**: 对于更复杂的定时任务需求,如需要管理大量的定时作业,或者需要更灵活的调度策略,可以...

    java定时器

    使用`Timer`类的`schedule(TimerTask task, long delay)`或`schedule(TimerTask task, Date firstTime)`方法可以安排任务在延迟一段时间后或指定时间首次执行。如果需要周期性执行任务,可以使用`schedule(TimerTask...

    java 定时任务及jar包

    - 使用`schedule(TimerTask task, long delay)`方法可以延迟一段时间后执行任务,`schedule(TimerTask task, Date firstTime)`则可以指定具体时间开始。 - `scheduleAtFixedRate(TimerTask task, long ...

    使用Timer和TimerTask实现周期任务

    它的工作原理是创建一个后台线程,这个线程会等待一段时间,然后执行由 `TimerTask` 定义的任务。`Timer` 类提供了一些方法来安排任务的执行,如 `schedule(TimerTask task, long delay)` 和 `schedule(TimerTask ...

Global site tag (gtag.js) - Google Analytics