Timer的异常

  定时任务用Timer实现有可能出现异常,因为它是基于绝对时间而不是相对时间进行调度的。当环境的系统时间被修改后,原来的定时任务可能就不跑了。另外需要注意一点,捕获并处理定时任务的异常。如果在TimerTask里抛出了异常,那么Timer认为定时任务被取消并终止执行线程。举例:

package com.wulinfeng.concurrent;

import java.util.Timer;
import java.util.TimerTask;

public class OutOfTime {

    public static void main(String[] args) throws InterruptedException {
        Timer timer = new Timer();

        // 设置一个一次性的定时任务,1秒后执行
        timer.schedule(new PrintTask(), 1000);

        // 休眠一秒
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 设置一个一次性任务,间隔1秒执行
        timer.schedule(new ThrowTask(), 1000);

        // 休眠一秒
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 再设置一个周期性任务,可是不会再来了
        timer.schedule(new PrintTask(), 1000, 1000);
    }

    static class PrintTask extends TimerTask {

        @Override
        public void run() {
            System.out.println("I‘m coming...");
        }

    }

    static class ThrowTask extends TimerTask {

        @Override
        public void run() {
            throw new RuntimeException();
        }

    }
}

  运行结果:

I‘m coming...
Exception in thread "Timer-0" java.lang.RuntimeException
    at com.wulinfeng.concurrent.OutOfTime$ThrowTask.run(OutOfTime.java:50)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
Exception in thread "main" java.lang.IllegalStateException: Timer already cancelled.
    at java.util.Timer.sched(Timer.java:397)
    at java.util.Timer.schedule(Timer.java:248)
    at com.wulinfeng.concurrent.OutOfTime.main(OutOfTime.java:34)

  如果注掉这一行,那么定时任务还是会一直跑下去的

timer.schedule(new ThrowTask(), 1000);
时间: 2024-10-14 06:50:16

Timer的异常的相关文章

Android Timer使用的异常:Timer was canceled 处理方法

1 异常日志: java.lang.IllegalStateException: Timer was canceled 2 所做操作: 调用cancel()取消后不能再执行 schedule语句,否则提示出现以上异常. 3 解决方案: 正确的中止Timer方法: timer.cancel(); timer.purge(); timer = null;(可选)

关于dubbo服务产生异常之:Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer.

简单来说就是dubbo超时,因为dubbo默认的时间是500ms,超过这个时间它会重新访问service层,最多尝试三次. 所以我在测试的时候日志显示出来的异常为……timeout……. 开始设置开始设置的timeout=50000,小数据量可以,如果数据量比较大就不行了. 后来在服务提供端设置timeout=1200000 <dubbo:service interface="com.XXXX.XXXXX.CardService" ref="cardService&qu

Timer的故事

咱们今天也来说说定时器Timer Timer是什么? Timer  n. [电子] 定时器:计时器:计时员 从翻译来看,我们可以知道Timer的本意是,定时定点. 而JDK中Timer类也的确是这个本意.那么接下来,我们通过JDK中的源码来学习下Timer这个类. 1 private final TaskQueue queue = new TaskQueue(); 2 private final TimerThread thread = new TimerThread(queue); Timer

Timer与AlarmManager的区别

线程 通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,但此时并没有运行,它需要CPU时间片.一旦得到CPU时间片,就会执行run()方法.run()的方法体称为线程体,它包含了要执行的这个线程的内容,run()方法运行结束,此线程也随即终止. 线程状态转换 一.新建(new):新创建了一个线程对象. 二.可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法.该状态的线程位于可运行线程池中,等待被线程

ARM Cortex-M3 异常优先级以及CMSIS RTOS RTX的中断优先级

通常异常包括一些系统异常,以及中断. 异常类型 Cortex-M3处理器支持多种类型的异常: RESET, NMI, HardWare Fault; PSV,SVC等可编程中断: 其他的可编程中断,例如timer,GPIO等. 其中第1类异常的优先级是固定,不可改变的.其他都是可以修改的. Cortex-M3处理器提供了PRIMASK选项,用来屏蔽所有可编程的中断:提供了FAULTMASK来屏蔽HardWare Fault和所有可屏蔽中断. 异常优先级 Cortex-M3处理器支持NVIC的中断

POSIX Timer

SYNOPSIS #include <signal.h> /* only timer_create need this header */ #include <time.h> int timer_create(clockid_t clockid, struct sigevent *restrict evp, timer_t *restrict timerid); int timer_delete(timer_t timerid); int timer_gettime(timer_t

java连接oracle数据库,关闭连接出现异常:java.sql.SQLRecoverableException: IO Error: Connection reset

java.sql.SQLRecoverableException: IO Error: Connection reset at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:612) at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:5094) at com.sms.send.StartTaskNew.run(SmsSend.java

Java Timer定时器原理

做项目很多时候会用到定时任务,比如在深夜,流量较小的时候,做一些统计工作.早上定时发送邮件,更新数据库等.这里可以用Java的Timer或线程池实现.Timer可以实现,不过Timer存在一些问题.他起一个单线程,如果有异常产生,线程将退出,整个定时任务就失败. 下面是一个Timer实现的定时任务Demo,会向控制台每隔一秒输出Do work... 1 import java.util.Date; 2 import java.util.Timer; 3 import java.util.Time

多线程之Timer和TimerTask

Timer是一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask.TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力. 测试代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import java.util.TimerTask;   public class OneTask extends TimerTask{       private int id;