2013-04-14 55 views
0

我正在Java中編寫一個應用程序,並且被困在以下內容中:經過一段時間後,顯示了一個inputDialog(JOptionPane)。因爲間隔時間很短,即10秒,如果我延遲與第一個對話框交互,那麼第二個對話框會立即出現。有什麼辦法可以避免這種情況?我認爲該計劃將等待我的意見。Java定時器不會等待前一個TimerTask在新的啓動之前完成

代碼:

Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 
      String task = JOptionPane.showInputDialog(null, "What are you doing now???", ""); 
      } 
     }, 10*1000, 10*1000); 
+0

如果這是一個Swing應用程序,則不應該使用java.util.Timer,因爲它可能會從Swing事件線程中調用Swing代碼。考慮使用Swing Timer,並在打開下一個之前測試前一個對話框是否已關閉。 –

+0

唯一的Swing組件是這個對話框,我沒有其他框架。我應該繼續嗎? –

+0

個人而言,從一開始就改變程序的設計。我會創建一個完整的圖形用戶界面,而不是在用戶處拋出對話框。 –

回答

1

Timer只是檢查運行中的方法如果任務已經在運行,而當它,返回。

可變

static boolean isRunning = false; 

添加到您的TimerTask實現類。你的運行方法則是這樣的:

public void run() { 
    if (isRunning == false) { 
     isRunning = true; 

     // your code 

     isRunning = false; 
    } 
} 
+0

雖然我採用了另一種實現,但我喜歡這個。 –

+0

@py_script請提及您採用和實施的替代方案,以便對其他人有所幫助。 – Gopal00005

+0

我發現有一些機會在這裏出現裂縫,因爲不能保證在檢查後立即執行'isRunning = true'。我們可能遇到另一個線程執行速度更快的競爭條件。正確保證這一點的唯一方法是通過同步線程恕我直言,但隨後我們可能會看到backpressure作爲計時器事件建立起來,如果他們需要更長的時間。 –

1
try { 
    Thread.sleep(10000); 
} catch(InterruptedException ex) { 
    Thread.currentThread().interrupt(); 
} 
+0

我必須在單獨的塊中或在運行方法中執行此操作嗎? –

+0

無論你想要什麼 –

1

試試停止/開始從TimerTask

final Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
     timer.stop(); 
     String task = JOptionPane.showInputDialog(null, "What are you doing now???", ""); 
     timer.start(); 
     } 
    }, 10*1000, 10*1000); 
0

我喜歡那些誰偷懶,因爲我的:

計時器等待。它一次只能運行一項任務。

(**與Java-1.8.0-的openjdk測試)

代碼(階,但是,它是用Java定時器):

import java.util.{Timer, TimerTask} 

object O { 
    val iGen = new AtomicInteger() 

    def main(args: Array[String]): Unit = { 
     val timer = new Timer() 

     val timerTask = new TimerTask { 
      override def run(): Unit = { 
       val tid = iGen.incrementAndGet() 
       println(s"--- task #$tid started") 
       Thread sleep(5000) 
       println(s"--- task #$tid done") 
      } 
     } 

     timer.schedule(timerTask, 0, 1000) 
    } 
} 

輸出:

--- task #1 started 
--- task #1 done 
--- task #2 started 
--- task #2 done 
--- task #3 started 
--- task #3 done 
--- task #4 started 
--- task #4 done 
--- task #5 started 
--- task #5 done 
--- task #6 started 
--- task #6 done 
--- task #7 started 
--- task #7 done 
--- task #8 started 
--- task #8 done 
--- task #9 started 
--- task #9 done 
--- task #10 started 
--- task #10 done 
--- task #11 started 
--- task #11 done 
--- task #12 started 
--- task #12 done 
--- task #13 started 
--- task #13 done 
--- task #14 started 
--- task #14 done 
--- task #15 started 
--- task #15 done 
--- task #16 started 
--- task #16 done 
--- task #17 started 
--- task #17 done 
--- task #18 started 
--- task #18 done 
--- task #19 started 
--- task #19 done 
--- task #20 started 
--- task #20 done 
--- task #21 started 
--- task #21 done 
--- task #22 started 
--- task #22 done 
--- task #23 started 
--- task #23 done 
--- task #24 started 
--- task #24 done 
--- task #25 started 
--- task #25 done 
--- task #26 started 
--- task #26 done 
--- task #27 started 
--- task #27 done 
--- task #28 started 
--- task #28 done 
--- task #29 started 
--- task #29 done 
--- task #30 started 
--- task #30 done 
--- task #31 started 
--- task #31 done 
--- task #32 started 
--- task #32 done 
--- task #33 started 
--- task #33 done 
--- task #34 started 
--- task #34 done 
--- task #35 started 
--- task #35 done 
--- task #36 started 
--- task #36 done 
--- task #37 started 
--- task #37 done 
--- task #38 started 
相關問題