2012-10-23 11 views
7

とタイマーの作成、私はこれに出くわした: using ScheduledExecutorService to start and stop timerはScheduledExecutorService

彼らが持っている例はかなり良好に動作するようです。この、

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    long pastTime = System.currentTimeMillis(); 
    TimerTest timer = new TimerTest(); 
    timer.startTimer(15000, "bh", 1); 
    long time; 
    int count =0; 
    boolean stop = false; 
    while(true) 
    { 

     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     time = System.currentTimeMillis() - pastTime; 

     if (time > 3000) 
     { 
      if (!stop){ 
       System.out.println("we are reseting the timer"); 
       timer.resetTimer(4000); 

       timer.stopTimer(); 
       try { 
        Thread.sleep(3995); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       break; 

      } 
      stop = true; 


     } 
     if (timer.isTimeup()) 
     { 
      System.out.println("our time is up"); 
      timer.endTimer(); 
      break; 
     } 
     if (!stop) 
      System.out.println("hello"); 
     else 
     { 
      if (count == 0) 
       System.out.println("we wait 10 seconds from now"); 
      count++; 
     } 


    } 
    timer.resetTimer(1200); 
    while (true) 
    { 
     if (timer.isTimeup()) 
     { 
      timer.isTimeup(); 
      System.out.println("breaking after time is up"); 
      break; 
     } 
    } 
    timer.endTimer(); 

} 

これが動作しているようですが、私は必要逃した何かのかもしれないです:

public class TimerTest 
{ 
    private ScheduledExecutorService es = null; 
    private boolean timeIsUp = false; 
    private ScheduledFuture futureHandler = null; 
    private TimeKeeper timeKeeper = null; 
    private String subject = ""; 
    private int siteNo; 
    private long time; 
    private boolean stop; 




public void endTimer() 
{ 
    System.out.println("we should shutdown everything here"); 
    es.shutdownNow(); 
} 

public boolean stopTimer() 
{ 

    if (timeKeeper != null) 
    { 
     timeKeeper.deactivate(); 
    } 
    futureHandler.cancel(true); 
return true; 

} 
public boolean isTimeup() 
{ 
    return timeKeeper.isTimeUp(); 
} 
public void startTimer(long mseconds, String subj, int sNo) 
{ 
    subject = subj; 
    siteNo = sNo; 
    time = mseconds; 
    timeKeeper = new TimeKeeper(); 
    callScheduler(mseconds); 

} 

public boolean isTimerRunning() 
{ 
    return (es.isShutdown() || es == null); 

} 
public void resetTimer(long t) 
{ 
    stopTimer(); 
    callScheduler(t); 
} 

public void resetTimer() 
{ 

    resetTimer(time); 
} 

private void callScheduler(long mseconds) 
{ 
    if (es == null) 
     es = Executors.newScheduledThreadPool(3); 
    timeKeeper = new TimeKeeper(); 
    futureHandler = es.schedule(timeKeeper, mseconds, TimeUnit.MILLISECONDS); 

} 


private class TimeKeeper implements Runnable { 
    //volatile for thread-safety 

    private volatile boolean isActive = true; 
    private volatile boolean isTimeUp = false; 
    public void run() { 
     if (isActive){ 
      callAlert(); 
      isTimeUp = true; 
     } 
    } 
    public void deactivate(){ 
     isActive = false; 
    } 

    public boolean isTimeUp() 
    { 
     return isTimeUp; 
    } 
    private void callAlert() 
    { 
     System.out.println("you are in the callAlert method"); 
    } 
    } 

} 

そして、ここではテストです:私はちょうど私がこれを正しく利用していた場合に思ったんだけどScheduledExecutorServiceで初めての作業です。このコードで問題が発生しましたか? 私は、スレッドの衝突と衝突することはありません。

+0

あなたのコードを通してもらうのではなく、コードが何をしているのか、どこで問題に直面しているのかを簡単に説明できればうれしいです。 – Arham

答えて

5

ScheduledExecutorServiceを使用すると、自動的にタイマー機能が利用できます。 ScheduleExecutorServiceが提供できないものがない限り、明示的にその必要はありません。例: たとえば、10秒間の初期遅延の後にタスクを開始し、その後5秒間の遅延を開始したいとします。

public void init() { 
    executor = new ScheduledThreadPoolExecutor(corePoolSize); 
    executor.scheduleWithFixedDelay(new WorkerThread(), 10, 5, TimeUnit.SECONDS); 
} 

public void end() { 
    executor.shutdown(); 
} 
+0

タイムアウトしていないときにタイマーをリセットするタイマーを作成する必要があります(タイマーがタイムアウトする前に特定のタスクが終了します)。私は新しいスケジューラーを開始する方法と、それを終了する方法を知っています。どうやってそれをリセットしますか?それをどうやって止めますか?多分それは私の質問だったはずです。 私はスケジューラを完全に終了させるとは思っていません。 – echew

+0

ありがとう、私は答えが二度と読んだ後に役立つと思います。 – echew

+0

それを知ってうれしい! :) – Arham

関連する問題