2011-02-16 8 views
1

..timertask in blackberry、実行を中断することなくスケジュール時間を変更しますか?私はいくつかのバックグラウンドプロセスを実行するために<a href="http://www.blackberry.com/developers/docs/6.0.0api/java/util/TimerTask.html" rel="nofollow">TimerTask</a>を使用してい

schedule(TimerTask task, long delay, long period) 

私はそれが変更された時間を使用する必要があり、実行の次のサイクルから、作業を中断することなく、長い期間の値を変更したい...

これは中断することなく可能ですか?また、timerTaskをキャンセルしてから再起動する必要がありますか?

答えて

0

実行中のタスクの間隔を変更することはできませんが、問題に取り組むためにこれを思いついたのです。これは実際にはJavaのコンソールプログラムです(私はLinuxだけで、自宅ではBlackBerry-environmentを使用できません)。私は個人的な静的なクラスを使って1つのファイル内で動作させましたが、非常に明確である:

import java.util.Scanner; 
import java.util.Timer; 
import java.util.TimerTask; 


public class Main 
{ 
    public static void main(String[] args) 
    { 
     //Start a new task which runs every 1000ms 
     TimerTest test = new TimerTest(1000L); 
     TimerTaskStarter.startTask(test); 

     //Wait for enter 
     Scanner sc = new Scanner(System.in); 
     while(!sc.nextLine().equals("")); 

     //Change the interval (actually starts a new TimerTest after the current one runs next time) 
     //since there's a new instance involved, the return value needs to be stored so it can be cancelled/controlled 
     test = test.changeIntervalAtNextRun(500); 

     //Wait for another enter   
     while(!sc.nextLine().equals("")); 
     test.cancel(); 
     System.exit(0); 
    } 

    private static class TimerTaskStarter 
    { 
     public static void startTask(TimerTest task) 
     { 
      //Basic Timer-stuff 
      Timer timer = new Timer(); 
      timer.schedule(task, task.getInterval(), task.getInterval()); 
     } 
    } 

    private static class TimerTest extends TimerTask 
    { 
     /** 
     * Current interval 
     */ 
     private long interval; 

     /** 
     * Flag to indicate interval change at next run 
     */ 
     private boolean changeInterval; 

     /** 
     * The new instance running with the new interval once started 
     */ 
     private TimerTest nextInstance; 


     public TimerTest(long interval) 
     { 
      this.interval = interval; 
      changeInterval = false; 
     } 

     @Override 
     public void run() 
     { 
      //The actual thing this task does goes here 
      System.out.println("Running task"); 

      if(changeInterval == false) 
      { 
       //Not changing interval, just keep running 
       System.out.println("Current interval is " + interval); 
      } 
      else 
      { 
       //Changing interval, cancel self and start new task 
       System.out.println("Startingting new instance with interval " + interval); 
       cancel(); 

       //Start a new task with new interval 
       TimerTaskStarter.startTask(nextInstance); 
      } 
     } 

     /** 
     * Creates a new task with given interval. This task is cancelled and new task is automatically started 
     * the next time this task runs 
     * @param newInterval Interval to run the new instance at 
     * @return new TimerTest-instance 
     */ 
     public TimerTest changeIntervalAtNextRun(long newInterval) 
     { 
      interval = newInterval; 
      changeInterval = true; 
      nextInstance = new TimerTest(interval); 
      return nextInstance; 
     } 

     /** 
     * Returns current interval 
     * @return Interval as milliseconds 
     */ 
     public long getInterval() 
     { 
      return interval; 
     } 
    } 
} 

のでTimerTaskを拡張するクラス(TimerTest)が要求された間隔でタスク自体が実行される次回に開始され、自身の別のインスタンスを作成することができます。 changeIntervalAtNextRunは、現在のタスクが次に実行されたときに自動的に起動される新しいインスタンスを返します。現在のタスクは、その時点で自身を取り消します。私は物事をシンプルに保つためにTimerTaskStarter.startTask静的を作っ

、それは非常によく、すべてのTimerTestさんchangeIntervalAtNextRunに渡すことができ、現在実行中のタスク、およびTimerTestインスタンスを保持しているマネージャークラスのいくつかの並べ替えすることができ与えるだろう新しい仕事をそれに直接。複数のスレッドでは、発生する同期の種類が必要になるかもしれませんが、この例では考慮していません。これが助けてくれることを願っています(質問は2,3ヶ月前です)。

関連する問題