延时执行
间隔某段时间之后,再去执行某段代码,实现这种结果有两种方式:
1)使用Sleep方法,就是去新建一个线程,然后里边放一个Thread.sleep()方法,这也是比较通俗的做法。
new Thread(){
public void run(){
try {
Thread.sleep(5000);
System.out.println("love");
} catch (InterruptedException e) { }
}
}.start(); //这种内部匿名类的写法,快速生成一个线程对象,也有利于快速垃圾回收
但在main方法里直接加入Thread.sleep(),是对main线程的休眠;另一种错误的方法是把Thread.sleep放在一个方法内,而这个方法也是在main方法体内调用,与前者结果一样。
当然也可以使用 Java API 提供的Timer类,来实现。如下代码所示:
public class TimerDemo {
public static void main(String[] args) {
final Timer timer=new Timer(); TimerTask task=new TimerTask(){
public void run(){
System.out.println("计时任务");
//timer.cancel(); 终止此计时器,丢弃所有当前已安排的任务。这不会干扰当前正在执行的任务(如果存在)。一旦终止了计时器,那么它的执行线程也会终止,并且无法根据它安排更多的任务。注意,在此计时器调用的计时器任务的 run 方法内调用此方法,就可以绝对确保正在执行的任务是此计时器所执行的最后一个任务。
}
};
timer.schedule(task,5000, 2000); //这个命令就是5秒钟之后执行TimerTask里边的内容,后边的执行时间间隔为2秒钟。
}
}
通过调试发现,创建一个Timer对象,就会创建一个main线程之外的独立子线程程序,来专门执行计时器里的任务,而任务也被理解成为对象:TimerTask,这也体现了JAVA中一切皆是对象的理念。一个Timer里即使有多个TimerTask对象,也只会开启一个线程来应付。简单的时间延迟还是推荐用第一种方案,当然如果有间隔性的执行,只能用第二种。如果硬要第一种方案实现间隔性的执行,只能引入线程池来解决,那样就杀鸡用牛刀了。
2)现在SUN推出新的解决方案,beepForAnHour设置了 ScheduledExecutorService ,在 1 小时内每 10 秒钟蜂鸣一次:
import static java.util.concurrent.TimeUnit.SECONDS;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
class BeeperControl {
private final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1); //创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。池中所保存的线程数为1个,即使线程是空闲的也包括在内。
public void beepForAnHour() {
final Runnable beeper = new Runnable() {
public void run() { System.out.println("beep"); }
};
final ScheduledFuture
参考http://blog.sina.com.cn/s/blog_80dbc63e0101efbq.html