java延时设置
????????間隔某段時間之后,再去執(zhí)行某段代碼,實(shí)現(xiàn)這種結(jié)果有兩種方式:
?1)使用Sleep方法,就是去新建一個線程,然后里邊放一個Thread.sleep()方法,這也是比較通俗的做法。
?????????new Thread(){
????????????public void run(){
???????????????try {
??????????????????Thread.sleep(5000);
??????????????????System.out.println("love");
???????????????} catch (InterruptedException e) { }
????????????}
?????????}.start();?????//這種內(nèi)部匿名類的寫法,快速生成一個線程對象,也有利于快速垃圾回收
?????????但在main方法里直接加入Thread.sleep(),是對main線程的休眠;另一種錯誤的方法是把Thread.sleep放在一個方法內(nèi),而這個方法也是在main方法體內(nèi)調(diào)用,與前者結(jié)果一樣。
???????當(dāng)然也可以使用 Java API 提供的Timer類,來實(shí)現(xiàn)。如下代碼所示:
public class TimerDemo {??
??public static void main(String[] args) {
?????final Timer timer=new Timer(); TimerTask task=new TimerTask(){
????????public void run(){
????????????System.out.println("計時任務(wù)");
???????????//timer.cancel();?????????終止此計時器,丟棄所有當(dāng)前已安排的任務(wù)。這不會干擾當(dāng)前正在執(zhí)行的任務(wù)(如果存在)。一旦終止了計時器,那么它的執(zhí)行線程也會終止,并且無法根據(jù)它安排更多的任務(wù)。注意,在此計時器調(diào)用的計時器任務(wù)的 run 方法內(nèi)調(diào)用此方法,就可以絕對確保正在執(zhí)行的任務(wù)是此計時器所執(zhí)行的最后一個任務(wù)。?
???????????}
???????};
?????
???????timer.schedule(task,5000, 2000);???//這個命令就是5秒鐘之后執(zhí)行TimerTask里邊的內(nèi)容,后邊的執(zhí)行時間間隔為2秒鐘。
????}
}
????????通過調(diào)試發(fā)現(xiàn),創(chuàng)建一個Timer對象,就會創(chuàng)建一個main線程之外的獨(dú)立子線程程序,來專門執(zhí)行計時器里的任務(wù),而任務(wù)也被理解成為對象:TimerTask,這也體現(xiàn)了JAVA中一切皆是對象的理念。一個Timer里即使有多個TimerTask對象,也只會開啟一個線程來應(yīng)付。簡單的時間延遲還是推薦用第一種方案,當(dāng)然如果有間隔性的執(zhí)行,只能用第二種。如果硬要第一種方案實(shí)現(xiàn)間隔性的執(zhí)行,只能引入線程池來解決,那樣就殺雞用牛刀了。
???????2)現(xiàn)在SUN推出新的解決方案,beepForAnHour設(shè)置了 ScheduledExecutorService?,在 1 小時內(nèi)每 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);??//創(chuàng)建一個線程池,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行。池中所保存的線程數(shù)為1個,即使線程是空閑的也包括在內(nèi)。
???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
總結(jié)
- 上一篇: javaweb银行账目管理系统
- 下一篇: 宁波大学c语言理论考试试题科目一,科目一