另:如何知道一个TimerTask程序已经停止,并如何将它重新运行?(在不重启tomcat情况下)
18 个解决方案
#1
推荐使用Thread,不用TimerTask
#2
(1)过一段时间后不再运行,没有任何反应,这是什么原因呢?
---------------------------------------------------------
不会的,我以前使用TimerTask很好啊,你把你的code贴上来看看...
(2)如何知道一个TimerTask程序已经停止,并如何将它重新运行?(在不重启tomcat情况下)
----------------------------------------------------------
需要要东西来触发(或叫调用)它才可以执行啊,如果不启动tomcat的话.
---------------------------------------------------------
不会的,我以前使用TimerTask很好啊,你把你的code贴上来看看...
(2)如何知道一个TimerTask程序已经停止,并如何将它重新运行?(在不重启tomcat情况下)
----------------------------------------------------------
需要要东西来触发(或叫调用)它才可以执行啊,如果不启动tomcat的话.
#3
用while(true)循环试一下
#4
可能是TimerTask中run方法有问题,导致执行时间一长就抛异常了.
你可以在run方法中catch异常,然后将异常抛出,外围代码接受了这个异常之后,重新启动Timer
你可以在run方法中catch异常,然后将异常抛出,外围代码接受了这个异常之后,重新启动Timer
#5
up
#6
捕获一下异常
#7
Timer和TimerTask不适用于很复杂的情况。
一个TimerTask只能用于一个Timer,并且只能调度一次,不能重复调度。如果要多次调度一个任务,要构造新的TimerTask对象。
对于复杂的应用,使用1.5中引入的java.util.concurrent包,可导入1.4中使用。
一个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描述。
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
----------------------------------------------------------
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);
之后,就可以定时循环执行了。为什么还要再加一次调度呢?不解。
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不能重复调度
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,一个非常著名的开源项目,你要的功能基本都能实现。它是以任务调度器来进行任务管理的。
还是用TimerTask,适合比较简单的应用。
比较复杂的推荐你看quartz,一个非常著名的开源项目,你要的功能基本都能实现。它是以任务调度器来进行任务管理的。
#16
to: moylaugh(笑看风云)
我倒啊!你说的情况也不需要这样实现阿,只需要在被调度方法里判断是否执行就ok阿,如果不满足执行条件就直接返回。只需一次调度一直循环,所以也就不需要你所谓的多次调度了
我倒啊!你说的情况也不需要这样实现阿,只需要在被调度方法里判断是否执行就ok阿,如果不满足执行条件就直接返回。只需一次调度一直循环,所以也就不需要你所谓的多次调度了
#17
如果要自己写循环,还要调度框架作甚?
任务实际执行的代码是由TimerTask子类提供的,作为TimerTask的使用者(也就是你我),我希望提供给它一段执行代码,然后定时器定时执行,不希望把执行代码与定时调度代码耦合起来,不希望还要自己操心编写调度代码。
另外,timer内部只用一个线程运行所有的任务,所以希望每一个任务都尽可能的短小,如果你写一个循环不停执行,其他任务就没有运行的机会了。
任务实际执行的代码是由TimerTask子类提供的,作为TimerTask的使用者(也就是你我),我希望提供给它一段执行代码,然后定时器定时执行,不希望把执行代码与定时调度代码耦合起来,不希望还要自己操心编写调度代码。
另外,timer内部只用一个线程运行所有的任务,所以希望每一个任务都尽可能的短小,如果你写一个循环不停执行,其他任务就没有运行的机会了。
#18
看来理解有所不同-_-!
#1
推荐使用Thread,不用TimerTask
#2
(1)过一段时间后不再运行,没有任何反应,这是什么原因呢?
---------------------------------------------------------
不会的,我以前使用TimerTask很好啊,你把你的code贴上来看看...
(2)如何知道一个TimerTask程序已经停止,并如何将它重新运行?(在不重启tomcat情况下)
----------------------------------------------------------
需要要东西来触发(或叫调用)它才可以执行啊,如果不启动tomcat的话.
---------------------------------------------------------
不会的,我以前使用TimerTask很好啊,你把你的code贴上来看看...
(2)如何知道一个TimerTask程序已经停止,并如何将它重新运行?(在不重启tomcat情况下)
----------------------------------------------------------
需要要东西来触发(或叫调用)它才可以执行啊,如果不启动tomcat的话.
#3
用while(true)循环试一下
#4
可能是TimerTask中run方法有问题,导致执行时间一长就抛异常了.
你可以在run方法中catch异常,然后将异常抛出,外围代码接受了这个异常之后,重新启动Timer
你可以在run方法中catch异常,然后将异常抛出,外围代码接受了这个异常之后,重新启动Timer
#5
up
#6
捕获一下异常
#7
Timer和TimerTask不适用于很复杂的情况。
一个TimerTask只能用于一个Timer,并且只能调度一次,不能重复调度。如果要多次调度一个任务,要构造新的TimerTask对象。
对于复杂的应用,使用1.5中引入的java.util.concurrent包,可导入1.4中使用。
一个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描述。
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
----------------------------------------------------------
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);
之后,就可以定时循环执行了。为什么还要再加一次调度呢?不解。
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不能重复调度
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,一个非常著名的开源项目,你要的功能基本都能实现。它是以任务调度器来进行任务管理的。
还是用TimerTask,适合比较简单的应用。
比较复杂的推荐你看quartz,一个非常著名的开源项目,你要的功能基本都能实现。它是以任务调度器来进行任务管理的。
#16
to: moylaugh(笑看风云)
我倒啊!你说的情况也不需要这样实现阿,只需要在被调度方法里判断是否执行就ok阿,如果不满足执行条件就直接返回。只需一次调度一直循环,所以也就不需要你所谓的多次调度了
我倒啊!你说的情况也不需要这样实现阿,只需要在被调度方法里判断是否执行就ok阿,如果不满足执行条件就直接返回。只需一次调度一直循环,所以也就不需要你所谓的多次调度了
#17
如果要自己写循环,还要调度框架作甚?
任务实际执行的代码是由TimerTask子类提供的,作为TimerTask的使用者(也就是你我),我希望提供给它一段执行代码,然后定时器定时执行,不希望把执行代码与定时调度代码耦合起来,不希望还要自己操心编写调度代码。
另外,timer内部只用一个线程运行所有的任务,所以希望每一个任务都尽可能的短小,如果你写一个循环不停执行,其他任务就没有运行的机会了。
任务实际执行的代码是由TimerTask子类提供的,作为TimerTask的使用者(也就是你我),我希望提供给它一段执行代码,然后定时器定时执行,不希望把执行代码与定时调度代码耦合起来,不希望还要自己操心编写调度代码。
另外,timer内部只用一个线程运行所有的任务,所以希望每一个任务都尽可能的短小,如果你写一个循环不停执行,其他任务就没有运行的机会了。
#18
看来理解有所不同-_-!