2016-07-23 5 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); 
    } 
    } 

} 

、私は間に2秒の中に眠っている、3つのスレッドと各スレッドの印刷5回を始めています。

上記のコードの出力であるIは、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); 
    }); 

}); 

上記のコードの出力は以下の通りであるノードによって実行されたのと同じ方法で

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 

上記2つのコード(javascriptとjava)は同じ方法で実行されますか?

javascriptのコールバックに相当するJavaのスレッドの理解は正しいですか?

私が間違っている場合は、私に説明してください。

+1

いいえ、ブラウザにはwebWorkers以外のJavascriptスレッドはありませんが、これはここで遊んでいるものではありません。だから、JavaスレッドはJavascriptのコールバックのようなものではありません。彼らはまったく違うものです。 node.jsのユーザーJavascriptは*** single threaded ***です。一度に1つのJavascriptしか実行されません。 – jfriend00

答えて

1

Q:はNode.jsのを使用して私のコードを行い、コールバック関数は、Javaスレッドと同じように動作しますか?
回答:短い答え。 いいえ

print outputにもかかわらず、JavaとNodeJSの両方に対応していれば、実際にはマルチスレッドのように後者の外観になります。

残念ながら、NodeJSは、単一のスレッド言語であるJavascriptを使用してプログラミングされています。これは、mdn JSのマニュアルから明らかです。つまり、threadsに関連するキーワードは表示されません。

ただし、NodeJSで子プロセスを生成することは可能です。

参照: https://nodejs.org/api/child_process.html

Q:その後、頼むかもしれません。だから、なぜ私はNodeJSアプリケーションでこのスレッド状の現象を見ていますか?
A:アプリケーションのコードを実行するための - NodeJSはつのスレッドを持っており、それがイベント(コードブロック)を追跡しますキューを(LinkedListのだと思います)があります。

アプリケーションを起動したとき。

ノードは、Javaアプリケーションの実行方法と同様に、すべてのコード行を上から下に解析します。それはsetTimeout操作を見たとき、ノードは、コードのpushそのブロック(機能)意志setTimeout操作のイベントキューへと再び

(ねえ、2秒の時間の最小にコードブロックを実行)としてタグ付け。 ノードは、コードが正確に2秒で実行されることを保証するものではなく、最低2秒で実行されることを保証します。例えば。メインスレッドがブロックされている場合(無限ループなど)、setTimeout操作のコードブロックは決して実行されません。

だから、移動します。したがって、setTimeoutコードブロックがイベントキューにプッシュされた後。メインスレッドは、実行されるまで、JavaScriptコードを行単位で解析して解析します。完了すると、次のキューのコードブロックはshiftedになり、イベントキューは再び処理を開始します。

これはこれからも続きます。イベントキューに何もない場合、メインスレッドは何かがキューに入るまで何もしません。

これは、NodeJSアプリケーションが複数のスレッドを持つように動作している理由を疑うことを明確にしたいと考えています。

0

Node.jsは本質的にシングルスレッドです。すべての種類のイベントとコールバックを順番に処理するメインイベントループが1つあります。

スレッドは軽量プロセスです。ハードウェア(CPU)によっては、コードの真の並列実行が可能です。

これは、意識すべきプログラミングに多くの意味を持ちます。一般に、Javaスレッドでは、2つのスレッドが同時に同じリソースにアクセスすると問題に陥る可能性があります。ノードでは、メインイベントループの実行をブロックすると問題に陥る可能性があります。

は、より詳細な説明については、この記事を参照してください。http://bytearcher.com/articles/parallel-vs-concurrent/

関連する問題