在后台线程中执行任务的功能。 任务可以安排一次执行,或定期重复执行。我理解这两个类就像是两个循环不停的线程。
这个类是线程安全的:多个线程可以共享一个单独的Timer对象,而不需要外部同步。
实现注意事项:这个类可以扩展到大量并发计划任务(千应该没有问题)。
Java 5.0引入了java.util.concurrent
软件包,其中一个java.util.concurrent
程序是ScheduledThreadPoolExecutor ,它是用于以给定速率或延迟重复执行任务的线程池。 这实际上是对一个更灵活的替代Timer
/ TimerTask
组合,因为它允许多个服务线程,接受各种时间单位,并且不需要子类TimerTask
(只实现Runnable
)。 使用一个线程配置ScheduledThreadPoolExecutor
使其等同于Timer
。
Timer 只能执行没有返回值的任务,但可以利用类静态变量引出返回值。
这两个类的实例,相当于又启动了单独的线程。我理解,用两个timer,就可以自己写事件程序,一个timer定时监控某变量,一个自动执行。
import java.util.Timer;
import java.util.TimerTask;
public class App {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
int t=0;
public void run() {
System.out.println(1);
if(t==5){
timer.cancel(); //t=5,停止timer
}
t++;
}
},0,2000); //马上执行间隔2秒的动作。
}
}
ScheduledThreadPoolExecutor
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class App {
public static void main(String[] args) {
ScheduledThreadPoolExecutor st=new ScheduledThreadPoolExecutor(2);
st.scheduleAtFixedRate( ()->{
System.out.println(1);
},0, 1,TimeUnit.SECONDS);
st.scheduleAtFixedRate( ()->{
System.out.println(2);
},0, 2,TimeUnit.SECONDS);
}
}