我使用Node.js和回调函数的代码是否与Java线程相同
Does my code using Node.js and callback function works same as Java Threads?
我是节点并发模型的新手。
下面的代码显示了创建java线程并同时启动它。
package com.main;
class MyThread implements Runnable{
private int num = 0;
MyThread(int num){
this.num = num;
}
public void run() {
// TODO Auto-generated method stub
try{
System.out.println("Thread "+this.num);
for(int c = 0; c < 5; c++){
System.out.println(" Running thread "+(c+1));
Thread.sleep(2000);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
public class Example01 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread[] ts = null;
try{
ts = new Thread[]{
new Thread(new MyThread(1)),
new Thread(new MyThread(2)),
new Thread(new MyThread(3))
};
for(int x = 0; x < ts.length; x++){
ts[x].start();
}
}catch(Exception e){
System.out.println(e);
}
}
}
从上面的代码中,你可以看到,我启动了3个线程,每个线程打印5次,中间休眠2秒。
上述代码的输出为
Thread 1
Thread 2
Running thread 1
Thread 3
Running thread 1
Running thread 1
Running thread 2
Running thread 2
Running thread 2
Running thread 3
Running thread 3
Running thread 3
Running thread 4
Running thread 4
Running thread 4
Running thread 5
Running thread 5
Running thread 5
以同样的方式,我编写了一个javaScript代码,并由Node运行,如下所示
function forEach(theArray,func){
if(Array.isArray(theArray) === true){
for(var x = 0; x < theArray.length; x++){
func(theArray[x],x);
}
}
}
forEach([1,2,3],function(num,index){
console.log("Thread "+num);
forEach([0,1,2,3,4],function(num,index){
setTimeout(function(){
console.log("Running Thread "+(num+1));
},2000);
});
});
上述代码的输出如下,
Thread 1
Thread 2
Thread 3
Running Thread 1
Running Thread 2
Running Thread 3
Running Thread 4
Running Thread 5
Running Thread 1
Running Thread 2
Running Thread 3
Running Thread 4
Running Thread 5
Running Thread 1
Running Thread 2
Running Thread 3
Running Thread 4
Running Thread 5
上面两个代码(javascript和java)的运行方式相同吗?
我对Java线程等效于javascript回调的理解是正确的吗?
如果我错了,请解释一下。
Q:使用Node.js和回调函数的代码是否与Java线程相同
答:简短回答否。
尽管Java和NodeJS都有print output
,但确实让后者看起来像是多线程的。
不幸的是,NodeJS是使用Javascript编写的,Javascript是一种单线程语言,从mdnJS文档中可以明显看出这一点。也就是说,您将看不到任何与threads
相关的关键字。
但是请注意,您可以在NodeJS中生成子进程
请参阅:https://nodejs.org/api/child_process.html
问:然后你可能会问。那么,为什么我在NodeJS应用程序中看到这种类似线程的现象呢
A:对于运行应用程序代码-NodeJS只有一个线程,它有一个跟踪事件(代码块)的队列(想想LinkedList)。
启动应用程序时。
Node将从上到下解析每一行代码,类似于Java应用程序的运行方式。当看到setTimeout
操作时,Node会将setTimeout
操作的代码块(函数)push
放入事件队列中,并将其标记为(嘿,在最短2秒的时间内执行此代码块)
再说一遍注意节点不保证您的代码在精确的2秒内运行,它只保证至少在2秒内执行。例如,如果主线程被阻塞(无限循环或其他什么),你会发现setTimeout
操作的代码块永远不会被执行。
因此,继续前进。因此,在setTimeout
代码块被推入事件队列之后。主线程继续并逐行解析Javascript代码,直到完成为止。一旦完成,队列中的下一个代码块将获得shifted
,事件队列将再次开始处理。
这种情况一直持续下去。当事件队列中什么都没有时,主线程什么也不做,直到有东西进入队列。
希望这能澄清你对为什么你的NodeJS应用程序像有多个线程一样运行的怀疑。
java中的线程是轻量级进程。根据您的硬件(CPU),代码的真正并行执行是可能的。
这对编程有很多影响,您应该意识到这一点。通常,使用java线程,当两个线程同时访问同一资源时,可能会遇到麻烦。在node中,当您阻止主事件循环的执行时,可能会遇到麻烦。
请参阅本文以获得更深入的解释:http://bytearcher.com/articles/parallel-vs-concurrent/
- 是否存在React Native“;WEB代码安全防护”;
- 如何检查这个代码点火器php函数是否工作,该函数是否在ajax url中使用
- 调试一个简单的jQuery函数;想知道是否与其他代码冲突
- 是否有一种方法可以使用公共代码库在Java和JavaScript中进行输入验证
- 是否可以在JavaScript中包含HTML代码
- 检查用户是否具有角色分析云代码
- 是否可以将此javascript代码(或其中的一部分)移动到单独的文件中,而不是内联
- Javascript:是否可以读取外部脚本的原始代码
- JS代码有什么问题,让我知道代码是否可以改进
- 确定 JavaScript 代码是否为表达式
- 是否有脚本/代码可以一次将链接属性添加到多个链接
- 是否可以将类添加到解析云代码中
- 是否有可能在 WebBrowser 控件中调试 JavaScript 代码
- 如何检查Firefox是否使用asm.js代码
- 是否有一个Javascript函数可以使代码在运行时延迟
- 是否可以向用户发送javascript代码's浏览器安全
- 我需要让用户输入他的出生日期,并使用javascript检查其形式是否正确.我的代码不起作用
- PHP是否以与JavaScript相同的方式解释代码
- adal.js是否支持授权代码授予流
- jQuery-用于检查是否有任何字段不为空,然后将所有字段设为必需字段的代码