setInterval的这种行为是否意味着Javascript中的多线程行为?

setInterval的这种行为是否意味着Javascript中的多线程行为?,javascript,multithreading,setinterval,Javascript,Multithreading,Setinterval,在使用javascript时,我注意到了这一点。你可以用 var i=0; var startingTime=new Date().getTime(); setInterval("foo()",1); function foo() { i+=1; if ($("#foodiv").text()==i) { //we detected a doubled value (parallel execution) $("#repdiv").append(

在使用javascript时,我注意到了这一点。你可以用

var i=0; 
var startingTime=new Date().getTime();
setInterval("foo()",1);
function foo() {
    i+=1;
    if ($("#foodiv").text()==i) {
        //we detected a doubled value (parallel execution)
        $("#repdiv").append("[repetition on "+i+"]");
    }
    $("#foodiv").html(i);
    $("#timediv").html(Math.floor((new Date().getTime()-startingTime)/1000));
}
但是,当我阅读并尝试自己的时候,时间不是1毫秒,而是至少10毫秒左右。事实上,10秒后,i的值约为2300/2400,而不是预期的10000

这是程序的最小可能时间因素???当然不是。如果我试一下:

<html><head>
<script language="javascript" type="text/javascript" src="jquery-1.4.min.js"></script>
<script type="text/javascript">

var i=0;
var startingTime=new Date().getTime();

setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);

function foo() {
    i+=1;
    if ($("#foodiv").text()==i) {
        //we detected a doubled value (parallel execution)
        $("#repdiv").append("[repetition on "+i+"]");
    }
    $("#foodiv").html(i);
    $("#timediv").html(Math.floor((new Date().getTime()-startingTime)/1000));

}
</script>
</head>
<body>
<div id="foodiv"></div>  (counter)
<br/>
<div id="timediv"></div> (seconds passed)
<br/>
<div id="repdiv"></div>
<br/>
</body>
</html>

var i=0;
var startingTime=new Date().getTime();
setInterval(“foo()”,1);setInterval(“foo()”,1);setInterval(“foo()”,1);
setInterval(“foo()”,1);setInterval(“foo()”,1);setInterval(“foo()”,1);
setInterval(“foo()”,1);setInterval(“foo()”,1);setInterval(“foo()”,1);
setInterval(“foo()”,1);setInterval(“foo()”,1);setInterval(“foo()”,1);
setInterval(“foo()”,1);setInterval(“foo()”,1);setInterval(“foo()”,1);
setInterval(“foo()”,1);setInterval(“foo()”,1);setInterval(“foo()”,1);
setInterval(“foo()”,1);setInterval(“foo()”,1);setInterval(“foo()”,1);
setInterval(“foo()”,1);setInterval(“foo()”,1);setInterval(“foo()”,1);
函数foo(){
i+=1;
if($(“#foodiv”).text()=i){
//我们检测到一个加倍的值(并行执行)
$(“#repdiv”)。追加(“[repeation on”+i+”]);
}
$(“#foodiv”).html(i);
$(“#timediv”).html(Math.floor((new Date().getTime()-startingTime)/1000);
}
(柜台)

(几秒钟过去了)

计数器将运行得非常快,10秒后,我的值为12000!!!!。这对我来说是无法解释的,因为调用不是并行执行的(或者至少我们可以为不同的调用读取两倍的i值,如repdiv所示)

有人能给我解释一下吗?我知道所有这些调用都会给cpu带来很大的压力,但至少它会惊人地加快速度


我在论坛上阅读了你的所有回复和其他任务,它们证实了我的想法。但真正的问题是为什么!为什么他们把时间限制设为15毫秒,而我却可以连续拨打多个电话,从而获得更低的通话时间?我确信这种多重回调系统不是一种好的做法,但我可以做到,而且我可能会使cpu负载饱和。

在大多数浏览器中,JavaScript计时器值至少设置为15毫秒,即使给定的值较小。AFAIK仅谷歌Chrome使用4ms。另请参见的公认答案。

传递给
setInterval
方法的第二个值实际上是最小值。虽然1代表1毫秒,而且大多数浏览器不太可能给你这个超时。另一个答案是更可能是15毫秒左右

即使如此,第二项是最小值,它也很好地解释了第一个样本


第二个样本也可以用这种行为来解释。您调用的每个
setInterval
方法都会注册一个完全独立的回调。它们各自至少有1个,但彼此之间没有依赖关系。因此,它们在相同的1毫秒间隔内发射是完全有效的(只要它们自己在重新发射前等待1毫秒)

不,JavaScript没有多线程,至少目前没有


请阅读了解
setInterval
的工作原理。

不,Javascript是单线程的。运行
setInterval
setTimeout
时,将生成一个事件,然后将其添加到浏览器的执行队列中。因此,虽然您不能保证代码本身会在您希望它运行的时候准确地运行,但您可以确保每次应该生成事件时都会生成该事件。因此,在本例中,您有12个正在生成的事件彼此非常接近。我注意到您使用了
1
作为间隔值。但是,大多数浏览器中的最小值约为
15
(有关详细信息,请参阅)。浏览器将按照事件在执行队列中的顺序运行事件(在
setInterval
中,事件尝试播放追赶。有关详细信息,请查看Marcel链接的答案)


这意味着在第一个场景中,每15毫秒左右生成一个事件。因此计数器的递增速度较慢。但在第二种情况下,每15毫秒左右就会触发12个彼此非常接近的事件,因此计数器的增量要快得多。

您发布的代码不会运行,下面是更正的代码:

var i=0; 
setInterval(foo,1);

function foo() {
  i+=1;
  if ($("#foodiv").text()==i) {
    //we detected a doubled value (parallel execution)
    $("#repdiv").append("[repetition on "+i+"]");
  }
  $("#foodiv").html(i);
}
如果您在代码运行时查看CPU性能,您会发现它几乎不工作,这意味着较低的速率不是因为代码繁忙。它不会像你要求的那样频繁地触发间隔

(如果开始12个间隔,负载仍然几乎不可见。在一个内核上获得接近100%的负载之前,我开始了200个间隔。)


浏览器使用某种时钟来确定应该触发哪些间隔,并且该时钟的分辨率通常低于毫秒。因此,在下一个时钟滴答作响之前,间隔不会再次触发,在您的情况下,间隔似乎大约为15毫秒。

我不明白这段代码是如何工作的,set interval将函数作为第一个参数,而不是foo(),它必须更像setInterval(foo,1)。此外,在if和appender之后,还缺少一些结尾)此外,假设代码是正确的,那么这些值似乎是错误的。有了12个计时器,计数器的速度只有12倍,因此600将变成7200,而不是150000。有些东西告诉我,这不是OP测试的代码。你是对的,我多次编辑代码,并在家里重新创建,但概念没有改变。我会重复我有效地做过的事情。还有,如果你注意到我省略了html代码,如果你这样做的话,情况会变得更糟。我用秒的时间戳完成了编辑。我用秒的时间戳完成了编辑。可能是我无意中发现了绕过javascript开发人员施加的15毫秒限制的方法,以便完全消耗cpu或立即失去cpu