为什么我的TimerTask程序过一段时间后自动停了?

时间:2022-04-11 15:26:03
我使用一个servlet来启动TimerTask程序,在tomcat启动的时候自动启动,但是TimerTask程序过一段时间后不再运行,没有任何反应,这是什么原因呢?

另:如何知道一个TimerTask程序已经停止,并如何将它重新运行?(在不重启tomcat情况下)

18 个解决方案

#1


推荐使用Thread,不用TimerTask

#2


(1)过一段时间后不再运行,没有任何反应,这是什么原因呢?
---------------------------------------------------------
不会的,我以前使用TimerTask很好啊,你把你的code贴上来看看...

(2)如何知道一个TimerTask程序已经停止,并如何将它重新运行?(在不重启tomcat情况下)
----------------------------------------------------------
需要要东西来触发(或叫调用)它才可以执行啊,如果不启动tomcat的话.

#3


用while(true)循环试一下

#4


可能是TimerTask中run方法有问题,导致执行时间一长就抛异常了.
你可以在run方法中catch异常,然后将异常抛出,外围代码接受了这个异常之后,重新启动Timer

#5


up

#6


捕获一下异常

#7


Timer和TimerTask不适用于很复杂的情况。
一个TimerTask只能用于一个Timer,并且只能调度一次,不能重复调度。如果要多次调度一个任务,要构造新的TimerTask对象。
对于复杂的应用,使用1.5中引入的java.util.concurrent包,可导入1.4中使用。

#8


TimerTask不能重复调度???
你从哪里看到的?

#9


to treeroot(旗鲁特)

Throws: 
IllegalStateException - if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated.

-----------------------------------------------------

这段话摘自Timer的schedule方法的javadoc描述。

#10


可运行如下程序验证:

----------------------------------------------------------
import java.util.*;

public class OnlyTest {
    
    static class Task extends TimerTask {
        public void run() {
            System.out.println("task is running.");
        }
    }
    
    /** Creates a new instance of OnlyTest */
    public OnlyTest() {
    }
    
    public static void main(String[] args) throws Exception {
        Task task = new Task();
        Timer timer = new Timer();
        timer.schedule(task, 100);
        Thread.sleep(1000);
        timer.schedule(task, 100);
    }
}

-----------------------------------------------------------------------
运行结果:
task is running.
Exception in thread "main" java.lang.IllegalStateException: Task already scheduled or cancelled

#11


经过
timer.schedule(task, 100);
之后,就可以定时循环执行了。为什么还要再加一次调度呢?不解。

#12


再加一次调度只是为了验证一个task只能调度一次,不过上面的程序不够清楚,改一下:

Task task = new Task();
Timer timer1 = new Timer();
timer1.schedule(task, 100);
Thread.sleep(1000);
Timer timer2 = new Timer();
timer2.schedule(task, 100);

用两个timer调度一个task,结果是一样的
Exception in thread "main" java.lang.IllegalStateException: Task already scheduled or cancelled
证明TimerTask不能重复调度

#13


我不明白,调度一次就够了,何必画蛇添足呢?

#14


晕阿,如果你的任务需要在某个时间停止,过一段时间又重新运行,你是不是希望TimerTask可以重复调度呢?

#15


回复人:shoulders(Hibernate+Struts+Spring+Jsp+Servlet+EJB+Weblogic) 是错的,尽量少用thread,而且thread的定时非常不准。
还是用TimerTask,适合比较简单的应用。

比较复杂的推荐你看quartz,一个非常著名的开源项目,你要的功能基本都能实现。它是以任务调度器来进行任务管理的。

#16


to: moylaugh(笑看风云)

我倒啊!你说的情况也不需要这样实现阿,只需要在被调度方法里判断是否执行就ok阿,如果不满足执行条件就直接返回。只需一次调度一直循环,所以也就不需要你所谓的多次调度了

#17


如果要自己写循环,还要调度框架作甚?
任务实际执行的代码是由TimerTask子类提供的,作为TimerTask的使用者(也就是你我),我希望提供给它一段执行代码,然后定时器定时执行,不希望把执行代码与定时调度代码耦合起来,不希望还要自己操心编写调度代码。
另外,timer内部只用一个线程运行所有的任务,所以希望每一个任务都尽可能的短小,如果你写一个循环不停执行,其他任务就没有运行的机会了。

#18


看来理解有所不同-_-!

#1


推荐使用Thread,不用TimerTask

#2


(1)过一段时间后不再运行,没有任何反应,这是什么原因呢?
---------------------------------------------------------
不会的,我以前使用TimerTask很好啊,你把你的code贴上来看看...

(2)如何知道一个TimerTask程序已经停止,并如何将它重新运行?(在不重启tomcat情况下)
----------------------------------------------------------
需要要东西来触发(或叫调用)它才可以执行啊,如果不启动tomcat的话.

#3


用while(true)循环试一下

#4


可能是TimerTask中run方法有问题,导致执行时间一长就抛异常了.
你可以在run方法中catch异常,然后将异常抛出,外围代码接受了这个异常之后,重新启动Timer

#5


up

#6


捕获一下异常

#7


Timer和TimerTask不适用于很复杂的情况。
一个TimerTask只能用于一个Timer,并且只能调度一次,不能重复调度。如果要多次调度一个任务,要构造新的TimerTask对象。
对于复杂的应用,使用1.5中引入的java.util.concurrent包,可导入1.4中使用。

#8


TimerTask不能重复调度???
你从哪里看到的?

#9


to treeroot(旗鲁特)

Throws: 
IllegalStateException - if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated.

-----------------------------------------------------

这段话摘自Timer的schedule方法的javadoc描述。

#10


可运行如下程序验证:

----------------------------------------------------------
import java.util.*;

public class OnlyTest {
    
    static class Task extends TimerTask {
        public void run() {
            System.out.println("task is running.");
        }
    }
    
    /** Creates a new instance of OnlyTest */
    public OnlyTest() {
    }
    
    public static void main(String[] args) throws Exception {
        Task task = new Task();
        Timer timer = new Timer();
        timer.schedule(task, 100);
        Thread.sleep(1000);
        timer.schedule(task, 100);
    }
}

-----------------------------------------------------------------------
运行结果:
task is running.
Exception in thread "main" java.lang.IllegalStateException: Task already scheduled or cancelled

#11


经过
timer.schedule(task, 100);
之后,就可以定时循环执行了。为什么还要再加一次调度呢?不解。

#12


再加一次调度只是为了验证一个task只能调度一次,不过上面的程序不够清楚,改一下:

Task task = new Task();
Timer timer1 = new Timer();
timer1.schedule(task, 100);
Thread.sleep(1000);
Timer timer2 = new Timer();
timer2.schedule(task, 100);

用两个timer调度一个task,结果是一样的
Exception in thread "main" java.lang.IllegalStateException: Task already scheduled or cancelled
证明TimerTask不能重复调度

#13


我不明白,调度一次就够了,何必画蛇添足呢?

#14


晕阿,如果你的任务需要在某个时间停止,过一段时间又重新运行,你是不是希望TimerTask可以重复调度呢?

#15


回复人:shoulders(Hibernate+Struts+Spring+Jsp+Servlet+EJB+Weblogic) 是错的,尽量少用thread,而且thread的定时非常不准。
还是用TimerTask,适合比较简单的应用。

比较复杂的推荐你看quartz,一个非常著名的开源项目,你要的功能基本都能实现。它是以任务调度器来进行任务管理的。

#16


to: moylaugh(笑看风云)

我倒啊!你说的情况也不需要这样实现阿,只需要在被调度方法里判断是否执行就ok阿,如果不满足执行条件就直接返回。只需一次调度一直循环,所以也就不需要你所谓的多次调度了

#17


如果要自己写循环,还要调度框架作甚?
任务实际执行的代码是由TimerTask子类提供的,作为TimerTask的使用者(也就是你我),我希望提供给它一段执行代码,然后定时器定时执行,不希望把执行代码与定时调度代码耦合起来,不希望还要自己操心编写调度代码。
另外,timer内部只用一个线程运行所有的任务,所以希望每一个任务都尽可能的短小,如果你写一个循环不停执行,其他任务就没有运行的机会了。

#18


看来理解有所不同-_-!