隨筆-57  評(píng)論-202  文章-17  trackbacks-0
                如果要在程序中定時(shí)執(zhí)行任務(wù),可以使用java.util.Timer這個(gè)類(lèi)實(shí)現(xiàn)。使用Timer類(lèi)需要一個(gè)繼承了java.util.TimerTask的類(lèi)。TimerTask是一個(gè)虛類(lèi),需要實(shí)現(xiàn)它的run方法,實(shí)際上是他implements了Runnable接口,而把run方法留給子類(lèi)實(shí)現(xiàn)。
                下面是我的一個(gè)例子:

          class Worker extends TimerTask {
            
          public void run() {
              System.
          out.println("我在工作啦!");
            }

          }

                Timer類(lèi)用schedule方法或者scheduleAtFixedRate方法啟動(dòng)定時(shí)執(zhí)行,schedule重載了四個(gè)版本,scheduleAtFixedRate重載了兩個(gè)。每個(gè)方法的實(shí)現(xiàn)都不同,下面是每個(gè)方法的說(shuō)明:

          schedule

          public void schedule(TimerTask task,
                               long delay)
          Schedules the specified task for execution after the specified delay.

          Parameters:
          task - task to be scheduled.
          delay - delay in milliseconds before task is to be executed.
          Throws:
          IllegalArgumentException - if delay is negative, or delay + System.currentTimeMillis() is negative.
          IllegalStateException - if task was already scheduled or cancelled, or timer was cancelled.
          說(shuō)明:該方法會(huì)在設(shè)定的延時(shí)后執(zhí)行一次任務(wù)。

          schedule

          public void schedule(TimerTask task,
                               Date time)
          Schedules the specified task for execution at the specified time. If the time is in the past, the task is scheduled for immediate execution.

          Parameters:
          task - task to be scheduled.
          time - time at which task is to be executed.
          Throws:
          IllegalArgumentException - if time.getTime() is negative.
          IllegalStateException - if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated.
          說(shuō)明:該方法會(huì)在指定的時(shí)間點(diǎn)執(zhí)行一次任務(wù)。

          schedule

          public void schedule(TimerTask task,
                               long delay,
                               long period)
          Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay. Subsequent executions take place at approximately regular intervals separated by the specified period.

          In fixed-delay execution, each execution is scheduled relative to the actual execution time of the previous execution. If an execution is delayed for any reason (such as garbage collection or other background activity), subsequent executions will be delayed as well. In the long run, the frequency of execution will generally be slightly lower than the reciprocal of the specified period (assuming the system clock underlying Object.wait(long) is accurate).

          Fixed-delay execution is appropriate for recurring activities that require "smoothness." In other words, it is appropriate for activities where it is more important to keep the frequency accurate in the short run than in the long run. This includes most animation tasks, such as blinking a cursor at regular intervals. It also includes tasks wherein regular activity is performed in response to human input, such as automatically repeating a character as long as a key is held down.

          Parameters:
          task - task to be scheduled.
          delay - delay in milliseconds before task is to be executed.
          period - time in milliseconds between successive task executions.
          Throws:
          IllegalArgumentException - if delay is negative, or delay + System.currentTimeMillis() is negative.
          IllegalStateException - if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated.
          說(shuō)明:該方法會(huì)在指定的延時(shí)后執(zhí)行任務(wù),并且在設(shè)定的周期定時(shí)執(zhí)行任務(wù)。

          schedule

          public void schedule(TimerTask task,
                               Date firstTime,
                               long period)
          Schedules the specified task for repeated fixed-delay execution, beginning at the specified time. Subsequent executions take place at approximately regular intervals, separated by the specified period.

          In fixed-delay execution, each execution is scheduled relative to the actual execution time of the previous execution. If an execution is delayed for any reason (such as garbage collection or other background activity), subsequent executions will be delayed as well. In the long run, the frequency of execution will generally be slightly lower than the reciprocal of the specified period (assuming the system clock underlying Object.wait(long) is accurate).

          Fixed-delay execution is appropriate for recurring activities that require "smoothness." In other words, it is appropriate for activities where it is more important to keep the frequency accurate in the short run than in the long run. This includes most animation tasks, such as blinking a cursor at regular intervals. It also includes tasks wherein regular activity is performed in response to human input, such as automatically repeating a character as long as a key is held down.

          Parameters:
          task - task to be scheduled.
          firstTime - First time at which task is to be executed.
          period - time in milliseconds between successive task executions.
          Throws:
          IllegalArgumentException - if time.getTime() is negative.
          IllegalStateException - if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated.
          說(shuō)明:該方法會(huì)在指定的時(shí)間點(diǎn)執(zhí)行任務(wù),然后從該時(shí)間點(diǎn)開(kāi)始,在設(shè)定的周期定時(shí)執(zhí)行任務(wù)。特別的,如果設(shè)定的時(shí)間點(diǎn)在當(dāng)前時(shí)間之前,任務(wù)會(huì)被馬上執(zhí)行,然后開(kāi)始按照設(shè)定的周期定時(shí)執(zhí)行任務(wù)。

          scheduleAtFixedRate

          public void scheduleAtFixedRate(TimerTask task,
                                          long delay,
                                          long period)
          Schedules the specified task for repeated fixed-rate execution, beginning after the specified delay. Subsequent executions take place at approximately regular intervals, separated by the specified period.

          In fixed-rate execution, each execution is scheduled relative to the scheduled execution time of the initial execution. If an execution is delayed for any reason (such as garbage collection or other background activity), two or more executions will occur in rapid succession to "catch up." In the long run, the frequency of execution will be exactly the reciprocal of the specified period (assuming the system clock underlying Object.wait(long) is accurate).

          Fixed-rate execution is appropriate for recurring activities that are sensitive to absolute time, such as ringing a chime every hour on the hour, or running scheduled maintenance every day at a particular time. It is also appropriate for recurring activities where the total time to perform a fixed number of executions is important, such as a countdown timer that ticks once every second for ten seconds. Finally, fixed-rate execution is appropriate for scheduling multiple repeating timer tasks that must remain synchronized with respect to one another.

          Parameters:
          task - task to be scheduled.
          delay - delay in milliseconds before task is to be executed.
          period - time in milliseconds between successive task executions.
          Throws:
          IllegalArgumentException - if delay is negative, or delay + System.currentTimeMillis() is negative.
          IllegalStateException - if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated.
          說(shuō)明:該方法和schedule的相同參數(shù)的版本類(lèi)似,不同的是,如果該任務(wù)因?yàn)槟承┰颍ɡ缋占┒舆t執(zhí)行,那么接下來(lái)的任務(wù)會(huì)盡可能的快速執(zhí)行,以趕上特定的時(shí)間點(diǎn)。

          scheduleAtFixedRate

          public void scheduleAtFixedRate(TimerTask task,
                                          Date firstTime,
                                          long period)
          Schedules the specified task for repeated fixed-rate execution, beginning at the specified time. Subsequent executions take place at approximately regular intervals, separated by the specified period.

          In fixed-rate execution, each execution is scheduled relative to the scheduled execution time of the initial execution. If an execution is delayed for any reason (such as garbage collection or other background activity), two or more executions will occur in rapid succession to "catch up." In the long run, the frequency of execution will be exactly the reciprocal of the specified period (assuming the system clock underlying Object.wait(long) is accurate).

          Fixed-rate execution is appropriate for recurring activities that are sensitive to absolute time, such as ringing a chime every hour on the hour, or running scheduled maintenance every day at a particular time. It is also appropriate for recurring activities where the total time to perform a fixed number of executions is important, such as a countdown timer that ticks once every second for ten seconds. Finally, fixed-rate execution is appropriate for scheduling multiple repeating timer tasks that must remain synchronized with respect to one another.

          Parameters:
          task - task to be scheduled.
          firstTime - First time at which task is to be executed.
          period - time in milliseconds between successive task executions.
          Throws:
          IllegalArgumentException - if time.getTime() is negative.
          IllegalStateException - if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated.
          說(shuō)明:和上一個(gè)方法類(lèi)似。

                下面是我的一個(gè)測(cè)試片斷:

            public static void main(String[] args) throws Exception {
              Timer timer 
          = new Timer(false);
              timer.schedule(
          new Worker(), new Date(System.currentTimeMillis() + 1000));
            }
          posted on 2005-06-09 10:29 小米 閱讀(33750) 評(píng)論(7)  編輯  收藏 所屬分類(lèi): Java

          評(píng)論:
          # re: 用java.util.Timer定時(shí)執(zhí)行任務(wù) 2005-11-28 10:12 | JSDGJKGH
          JVDFHDVNDFFKUFUDRU;RTUDNGHKDFKLGJA...OODWWEWEWWEFTR  回復(fù)  更多評(píng)論
            
          # re: 用java.util.Timer定時(shí)執(zhí)行任務(wù) 2006-03-09 22:51 | Kornelius
          發(fā)現(xiàn)跟swing一起import的時(shí)候
          會(huì)衝到
          reference to Timer is ambiguous, both class javax.swing.Timer in javax.swing and class java.util.Timer in java.util match  回復(fù)  更多評(píng)論
            
          # re: 用java.util.Timer定時(shí)執(zhí)行任務(wù) 2008-01-12 00:14 | 張瓊
          謝謝你的代碼,我學(xué)到很多東西。。  回復(fù)  更多評(píng)論
            
          # re: 用java.util.Timer定時(shí)執(zhí)行任務(wù) 2009-03-17 09:28 | 2點(diǎn)
          頂~~~~好東西!!!  回復(fù)  更多評(píng)論
            
          # re: 用java.util.Timer定時(shí)執(zhí)行任務(wù) 2009-03-18 16:50 | ewqr
          ewrqewrqewrrwqe  回復(fù)  更多評(píng)論
            
          # re: 用java.util.Timer定時(shí)執(zhí)行任務(wù)[未登錄](méi) 2011-09-08 16:01 | linugb118
          如果timer已經(jīng)啟動(dòng),這個(gè)時(shí)候調(diào)整系統(tǒng)時(shí)候好像是沒(méi)有用的。同樣如果timer設(shè)置了10分鐘,自己將系統(tǒng)時(shí)間調(diào)整到10分種后,也是無(wú)效的,說(shuō)明timer只是在第一次初始化的時(shí)候才去取系統(tǒng)時(shí)間,后面都不去取的  回復(fù)  更多評(píng)論
            
          # re: 用java.util.Timer定時(shí)執(zhí)行任務(wù) 2015-11-12 23:23 | yunp
          public static void main(String[] args) throws Exception {
          Timer timer = new Timer(false);
          timer.schedule(new Worker(), new Date(System.currentTimeMillis() + 1000));
          }

          time不用執(zhí)行timer.cancel();方法退出嗎?如果有成千上萬(wàn)個(gè)這個(gè)任務(wù),一直不退出會(huì)不會(huì)泄漏?  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 磐安县| 凯里市| 且末县| 那曲县| 桐城市| 华宁县| 比如县| 化德县| 怀宁县| 延边| 邹平县| 鹿泉市| 井研县| 浑源县| 宜城市| 叙永县| 大同县| 开封市| 苍溪县| 莱州市| 南江县| 双桥区| 红原县| 启东市| 扎鲁特旗| 和林格尔县| 公安县| 徐汇区| 彰化市| 仁布县| 于都县| 滨海县| 礼泉县| 乳山市| 明星| 长岛县| 遂宁市| 甘洛县| 禄劝| 滦平县| 广水市|