java延时设置
????????間隔某段時間之后,再去執行某段代碼,實現這種結果有兩種方式:
?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
總結
- 上一篇: javaweb银行账目管理系统
- 下一篇: 宁波大学c语言理论考试试题科目一,科目一