我的代码使用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/