2016-07-23 47 views
2

我是新來的節點併發模型。我的代碼使用Node.js和回調函數是否與Java線程相同?

下面的代碼顯示了創建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代碼和由節點是如下

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); 
    }); 

}); 

上面的代碼的輸出是如下運行,

以上兩個代碼(javascript和java)是否以相同的方式運行?

我對Java的線程的理解等同於javascript的回調是正確的嗎?

如果我錯了,請解釋我。

+1

沒有Javascript線程(除了瀏覽器中的web工作者,但這不是在這裏玩什麼)。所以,Java線程幾乎不像Javascript回調。他們是完全不同的東西。 node.js中的用戶Javascript是***單線程***。一次只能運行一段Javascript代碼。 – jfriend00

回答

1

問:請問如何使用Node.js我的代碼和Java線程回調函數的工作原理一樣嗎?
- 答:簡短的回答。

儘管print output你得到了Java和NodeJS,但確實使後者看起來像是多線程的。

不幸的是,NodeJS是使用JavaScript編寫的,這是一種單線程語言,這可以從mdn JS文檔中明顯觀察到。也就是說,您不會看到任何與threads有關的關鍵字。

但請注意,您可能會在NodeJS中產生子進程。

參見: https://nodejs.org/api/child_process.html

問:你可能會再請教。那麼爲什麼我在NodeJS應用程序中看到這種類似線程的現象呢?
答:對於運行的應用程序代碼 - 具有的NodeJS僅一個線程,它有一個隊列(認爲鏈表),其跟蹤的事件(代碼塊)。

當您啓動您的應用程序。

節點將從上到下解析每一行代碼,類似於Java應用程序的運行方式。當它看到setTimeout操作中,節點將push的代碼(功能)爲setTimeout操作該塊到事件隊列和將其標記爲(喂,在最小2的秒時間執行的代碼塊)

再次。 注意節點不保證您的代碼準確運行2秒,它只能保證它將在至少2秒內執行。例如。如果主線程被阻塞(無限循環或某物),您將發現setTimeout操作的代碼塊將永遠不會被執行。

所以,繼續前進。因此在setTimeout代碼塊被推入事件隊列之後。主線程繼續運行並逐行解析Javascript代碼,直到完成。一旦完成,隊列的下一個代碼塊將獲得shifted,並且事件隊列再次開始處理。

而且這樣下去。當事件隊列中沒有任何東西時,主線程不會執行任何操作,直到進入隊列。

希望這可以解釋您爲什麼NodeJS應用程序正在運行,因爲它有多個線程。

0

Node.js本質上是單線程的。有一個主要事件循環會一個接一個地處理各種事件和回調。

java中的線程是輕量級進程。根據您的硬件(CPU),可以真正並行執行代碼。

這對編程有很大的影響,您應該注意。一般來說,使用Java線程時,當兩個線程同時訪問同一資源時可能會遇到麻煩。在節點中,當您阻止主事件循環的執行時,可能會遇到麻煩。

請參閱本文進行了較深入的解釋:http://bytearcher.com/articles/parallel-vs-concurrent/

相關問題