2012-11-06 63 views
1

我的情況是,我有兩個併發線程,一個不能啓動計時器,另一個可以停止計時器。定時器的工作原理是,一旦它啓動,它將計數到5秒,然後執行一個函數,直到定時器被另一個線程停止。這怎麼可以在Java中實現。這是我的,我覺得這是做錯的方式:在java中實現定時器

請注意,睡眠是一個全局易變的變量,其他兩個線程打開和關閉。

  void creatTime(final EventHandler handler) 
      { 
       Thread timer = new Thread() 
       { 
        public void run() 
        { 
         try 
         { 
          while(true) 
          { 
           while(sleep) Thread.sleep(1000); 

           //invoke function 

          } 
         } 
         catch(IOException e) 
         { 
          System.out.println(e); 
         } 
        } 
       }; 
       timer.start(); 
      } 
      } 
+0

嗯,我沒有看到任何人分配睡眠'布爾'任何值。 – GingerHead

+0

@Harutyun是的,我沒有公佈所有的代碼,它的長,但它只是簡單的,切換是同步的。 –

+0

爲什麼要睡1秒? –

回答

4

您可以創建一個TimerTask,並安排其每5秒鐘運行

TimerTask timerTask = new TimerTask() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       //Invoke your function here 
      } 
     }; 

//創建一個定時器,並安排它

Timer timer = new Timer(); 

timer.scheduleAtFixedRate(timerTask, 0, 5*1000); 

//要終止計時器可以請撥打它的cancel方法。

2

我同意TimerTask的建議。一般來說,您可以將更多與線程相關的工作傳遞給java.util.concurrent的更高級別功能等。例如,原始代碼不能處理從睡眠中早期喚醒的問題。另外,如果睡眠變量在重新設計之後仍然存在,則需要標記爲易失性或通過同步獲取和設置方法訪問。有一組有限的活動確保在一個線程中完成的寫入操作必須對另一個線程中的讀取操作可見。