2012-02-01 78 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