2012-02-01 66 views
1

我正在將一些Javascript代碼翻譯成Java,並且需要了解如何在Java中執行超時。我如何將以下內容翻譯成Java?Java等效的JavaScript超時函數

var x = setTimeout(function(){ ... }, 2000); 
clearTimeout(x); 
+1

您將不得不使用定時器線程進行此類工作。 – 2012-02-01 12:01:11

+0

也許這樣? http://docs.oracle.com/javase/6/docs/api/javax/swing/Timer.html – 2012-02-01 12:03:40

回答

0

創建啓動一個新的Thread。如果你需要延遲執行,你可以使用sleep()

無論如何,它基本上是不同的,在JS中你沒有'主線程'(JS由瀏覽器線程運行),而在Java中你有它。所以,如果你想要做的是在指定的時間單獨調用一個函數,你只需創建一個線程,並在該線程中創建一個包含睡眠和邏輯的循環(並將該線程標記爲守護進程)。

+0

創建新線程是否會對性能造成重大影響?我只想在500毫秒後設置一個變量,似乎有點矯枉過正產生一個新的線程,但如果沒有性能問題,我可以。 – 2012-02-01 12:05:51

+0

我相信通常它不輕,但它取決於環境,在J​​2EE中通常有一個池,所以大多數時候你不創建它們,但重用一些,在J2SE中我不確定(我相信沒有這樣的池)。另外,如果你在主線程中(因此'wait'凍結GUI)或者在一個輔助線程中,它是不一樣的。當然,你做了多少次。另外,不同的OS/VM實現可能意味着創建線程的不同處罰。 – SJuan76 2012-02-01 12:17:17

+0

謝謝,很高興知道。我想我會改變我的代碼模式來解決這個問題,從你的回答來看,Java計時器似乎不適合小任務,如果可以避免的話。 – 2012-02-01 12:29:48

0

創建一個線程並粘貼您的業務邏輯(您想在其中等待)。然後使用Thread.sleep(2000);。然而,它取決於你的需求,你想要用你的java代碼做什麼。你也可以使用public interface Lock這樣的:

Lock lock = ...; 
    if (lock.tryLock(50L, TimeUnit.SECONDS)) ... 
4

試試用java.util.Timer中

您可以安排任務時,在規定的時間結束或進入週期性間隔。使用

myTimer.schedule(tt,2000);

其中tt是來自java.util.TimerTask的TimerTask對象(您必須實現run()方法,它將對應於JavaScript中的「function(){...}」)。

+0

scheduleAtFixedRate定期任務 – cabreracanal 2012-02-01 12:39:21

+0

這是否創建一個新的線程?並有沒有一種等效的方式來取消js'clearTimeout()'? – 2012-02-01 12:56:40

+0

是的。您可以使用Timer類的cancel()方法取消它。 – cabreracanal 2012-02-01 13:23:58