2012-01-30 7 views
2

私はJavaでコンテンツ配信ネットワークを作成しています。私はシステム内の2つのノード間のソケットを管理するLinkクラスを持っています。 RouterNodeとDiscoveryNodeの2つのプログラムがあります。Javaスレッド実行を停止する必要はありません

ルータノードが起動すると、それが最初に行うことは、ディスカバリ・ノードへの接続を初期化しようとしている。

public RouterNode(int num) 
{ 
    myNumber = num; 
    input = new Scanner(System.in); 

    try { 
     discoveryServer = new Socket("MONDAY-PC", 60111); 
     myServerLink = new Link(this, discoveryServer); 
    } catch (IOException e) { 
     System.out.println("Socket could not be opened. Node terminating."); 
     System.exit(-1); 
    } 

あり、コンストラクタへのより多くのですが、私の問題は、過去を得ることから私のプログラムを保持しますこのtryブロック。

(ライン「myServerLink =新しいリンク(この、discoveryServer)で呼び出さ;)リンククラスのコンストラクタは、次のようななります

このコンストラクタの最後の行は、その新しいスレッドを開始し
public Link(Node n, Socket s) 
{ 
    parentNode = n; 
    regSocket = s; 
    try { 
     out = new DataOutputStream(regSocket.getOutputStream()); 
     in = new DataInputStream(regSocket.getInputStream()); 
    } catch (IOException e) { 
     System.out.println("Data Streams could not be created on the link."); 
     e.printStackTrace(); 
    } 


    new Thread(new LinkListenerThread(this, in)).run(); 
} 

渡されている着信メッセージをソケットで待機するように設計されています。

LinkListenerThreadの星でrun()メソッドに次のように:

@Override 
public void run() 
{ 
    byte[] message;  

    System.out.println("Link now active and running."); 
    while(!done) 
    { 
     System.out.println("attempting to read from socket..."); 

     try { 

      // read now many bytes the following message will be 
      byte[] messageLengthBytes = new byte[4]; 
      in.read(messageLengthBytes, 0, 4); 

を私の問題は、私はルータノードからリンクをインスタンス化したら、それは実行だが、ときにLinkListenerThreadはそれをブロックしているように見えるものから、停止していることですin.read()を呼び出します。このリスナーは別のスレッドで実行されているため、実際にはスレッドで奇妙なことがあるかどうか、または経験が不足しているかどうかは分かりません。

Iは、ノードクラスが明示的に実行可能な実装していないため、独自のスレッドではありませんされているので、私は別のスレッドで読んでいます私のプログラム内の別のインスタンスが

これが発生する可能性がありますか?

ご協力いただきまして誠にありがとうございます。

編集1:NodeクラスをRunnableを実装して独自のスレッドで開始するようにしましたが、in.read()が呼び出されるとロックされます。

+1

これはまた、スレッドを学びたい場合には、より簡単な方法で機能するプログラムでうまくいくことを望むならば、普通は – barlop

+0

に移動する必要があります。また、完全なファイルも含めるべきです。問題を示すプログラムのバージョン。 – barlop

+0

年齢ではJavaをやっておらず、スレッドはほとんどありませんでしたが、 "in"はスレッドでなければなりませんか? (もしそれが意味をなさないならば)スレッドとして "in"したくないなら、 "in"は続行するために完了しなければならないので、いくつかのprintlnsを使って "in"の位置を調べるべきです。 。)、詰まっている – barlop

答えて

0

Thread.start()の代わりにThread.run()メソッドを呼び出してスレッドを開始する予定です。そして、これはあなたのプログラムをシングルスレッドにし、データが入ってこない、またはwhileループが決して終わらない場合、I/O操作はtry-catch節の唯一のスレッド(メインスレッド)をブロックします。

Thread.start()を使用してスレッドを開始するだけで問題を解決できます。

0

問題が.startを(使用することで解決されています)の代わりに.RUNの()

それはすべてJavaでスレッドをインスタンス化する方法の誤解に煮詰まっ。

関連する問題