我的代码使用Node.js和callback函数与Java线程相同吗?

我是新的节点并发模型。

下面的代码显示了创buildJava线程并同时启动它。

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的callback是正确的吗?

如果我错了,请解释一下。

问:使用Node.js和callback函数的代码是否与Java线程相同?
答:简短的回答。 没有

尽pipeJava和NodeJS的print output确实使后者看起来像是multithreading的。

不幸的是,NodeJS是使用Javascript编写的,这是一种单线程语言,可以从mdn JS文档中看到。 也就是说,你不会看到任何关于threads关键字。

但请注意,您可能在NodeJS中产生subprocess。

请参阅: https : //nodejs.org/api/child_process.html

问:你可能会问。 那么为什么我在NodeJS应用程序中看到这种类似线程的现象呢?
答:对于运行应用程序代码 – NodeJS只有一个线程 ,它有一个队列 (思考LinkedList),用于跟踪事件(代码块)。

当你启动你的应用程序。

Node会从上到下parsing每一行代码,类似于Java应用程序的运行方式。 当它看到setTimeout操作时,Node会将setTimeout操作的代码块(函数) push入到事件队列中,并将其标记为(嘿,执行这段代码至less 2秒钟)

再次。 注意节点不保证你的代码在2秒钟内运行,它只能保证你的代码将在2秒钟内被执行。 例如,如果主线程被阻塞(无限循环或某些东西),你会发现setTimeout操作的代码块永远不会被执行。

所以,继续前进。 因此在setTimeout代码块被推入事件队列之后。 主线程移动并逐行parsingJavascript代码,直到完成。 一旦完成,队列的下一个代码块就会shifted ,事件队列再次开始处理。

这一直在继续。 当事件队列中没有任何东西的时候,主线程什么也不做,直到有东西进入队列。

希望能够澄清一下为什么你的NodeJS应用程序正在运行,就像它有多个线程一样。

Node.js本质上是单线程的。 有一个主要的事件循环会一个接一个地处理各种事件和callback。

java中的线程是轻量级的进程。 取决于您的硬件(CPU),可以真正并行执行代码。

这对编程有很大的影响,你应该知道。 一般来说,在java线程中,当两个线程同时访问同一个资源时,可能会遇到麻烦。 在节点中,当阻止主事件循环的执行时,可能会遇到麻烦。

看到这篇文章更深入的解释: http : //bytearcher.com/articles/parallel-vs-concurrent/