2010-02-14 87 views

回答

5

查看Rhino Examples页面上的Multithreaded Script Execution示例。基本上,JavaScript不直接支持线程,但您可以使用Java线程来实现您正在寻找的内容。

36

您可以使用java.util.Timerjava.util.TimerTask推出自己的设置/清除超时,并设置/清除间隔功能:

var setTimeout, 
    clearTimeout, 
    setInterval, 
    clearInterval; 

(function() { 
    var timer = new java.util.Timer(); 
    var counter = 1; 
    var ids = {}; 

    setTimeout = function (fn,delay) { 
     var id = counter++; 
     ids[id] = new JavaAdapter(java.util.TimerTask,{run: fn}); 
     timer.schedule(ids[id],delay); 
     return id; 
    } 

    clearTimeout = function (id) { 
     ids[id].cancel(); 
     timer.purge(); 
     delete ids[id]; 
    } 

    setInterval = function (fn,delay) { 
     var id = counter++; 
     ids[id] = new JavaAdapter(java.util.TimerTask,{run: fn}); 
     timer.schedule(ids[id],delay,delay); 
     return id; 
    } 

    clearInterval = clearTimeout; 

})() 
+0

Whit您的代码片段,我能够运行茉莉花无需使用EnvJS即可在Rhino中进行测试。谢谢! – 2011-05-28 15:25:01

+0

我希望我能给你100个upvotes,非常棒。非常感谢。 – Upgradingdave 2011-08-12 17:03:46

+2

太棒了。谢谢!为了与浏览器完全兼容,您还需要处理延迟的遗漏。 MDN表示,根据HTML5规范的最小延迟是4ms,所以添加以下内容:if(delay == null){delay = 4; } – 2012-04-20 10:08:56

2

使用ScheduledThreadPoolExecutor,犀牛1.7R4兼容,并提出了另一个版本的@Nikita-Beloglazov

var setTimeout, clearTimeout, setInterval, clearInterval; 

(function() { 
    var executor = new java.util.concurrent.Executors.newScheduledThreadPool(1); 
    var counter = 1; 
    var ids = {}; 

    setTimeout = function (fn,delay) { 
     var id = counter++; 
     var runnable = new JavaAdapter(java.lang.Runnable, {run: fn}); 
     ids[id] = executor.schedule(runnable, delay, 
      java.util.concurrent.TimeUnit.MILLISECONDS); 
     return id; 
    } 

    clearTimeout = function (id) { 
     ids[id].cancel(false); 
     executor.purge(); 
     delete ids[id]; 
    } 

    setInterval = function (fn,delay) { 
     var id = counter++; 
     var runnable = new JavaAdapter(java.lang.Runnable, {run: fn}); 
     ids[id] = executor.scheduleAtFixedRate(runnable, delay, delay, 
      java.util.concurrent.TimeUnit.MILLISECONDS); 
     return id; 
    } 

    clearInterval = clearTimeout; 

})() 

参考:https://gist.github.com/nbeloglazov/9633318

相关问题