2012-10-23 8 views
7
ile bir zamanlayıcı oluşturma

Bu yüzden bir zamanlayıcı nasıl oluşturulacağını anlamaya çalışıyorum, bu rastladım: using ScheduledExecutorService to start and stop timerScheduledExecutorService

sahip oldukları örnek oldukça iyi çalışıyor gibi görünüyor. Sadece merak ediyorum bunu doğru kullanan olmam durumunda: Ben, bu ihtiyaç cevapsız bir şeyin kudreti değilim, bu iş gibi görünüyor

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(); 

} 

: Burada

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"); 
    } 
    } 

} 

Ve Testi ilk defa ScheduledExecutorService ile çalışıyorum Bu kodla ilgili herhangi bir sorun görüyor musunuz? İplik çarpışmasıyla çakışma olmasını istemiyorum.

+0

İnsanların kodunuzu kullanmasını istemekten ziyade, kodunuzun ne işe yaradığını ve sorunla nerede karşılaştığınız konusunda bilgi sahibi olmanız iyi olur. – Arham

cevap

5

ScheduledExecutorService ile otomatik olarak zamanlayıcı özelliğini elde edersiniz. ScheduleExecutorService'nin sağlayamayacağı bir şey olmadıkça, ona açıkça ihtiyacınız yoktur. , ör. 10 saniyelik ilk gecikme ve ardından 5 saniyelik sonraki gecikmelerden sonra bir görev başlatmak istediğinizi varsayalım.

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

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

Zamanaşımı olmadığında zamanlayıcıyı sıfırlayacak bir zamanlayıcı yapmam gerekiyor (Zamanlayıcı zaman aşımına uğramadan belirli bir görev tamamlanır). Yeni bir programlayıcıyı nasıl başlatacağımı ve nasıl sonlandıracağımı biliyorum. Nasıl sıfırlarsın? Nasıl durdurursun? Belki de bu benim sorum olmalıydı. Zamanlayıcıyı bitirmek istediğim şey değil. – echew

+0

Teşekkürler, sanırım bir saniye sonra cevabın yardım ettiğini okudu. – echew

+0

bunu bilmek beni memnun etti! :) – Arham