Java中實現代碼的延遲執行


https://blog.csdn.net/xuwei198995/article/details/10136759

 

延時執行

間隔某段時間之后,再去執行某段代碼,實現這種結果有兩種方式:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM