2012-02-16 18 views
-2

私はコードを同期するためにjoinを使用しようとしています。ジョインが呼び出されると、親スレッドと子スレッドの両方で例外が発生する スレッド "thread3"の例外 スレッドの実行中の例外。Javaは私がjoinを呼び出すと、子スレッドと親スレッドで例外が発生します

スレッドはRuinableクラスで実行され、クラスが作成されるときにスレッドをパブリックメンバーに格納します。メインスレッドは、このパブリックメンバのjoinメソッドを呼び出します。

コードメインスレッドは、あなたがスレッドを作成しても、それを起動しないでください「メインスレッド」と呼ぶスニペットで

System.out.println(Thread.currentThread()+": waiting for 2 players"); 

do { 
    r=GetClient(); 
    switch(r) 
    { 
     case 0: return; // exitvon a very bad error 
    } 
} while(r==2);// loop if it was a timeout 
cMyConnection thread = new cMyConnection("thread3", connection, mPlayerList, mPlayersMessages); 
try { 
    thread.MyThread.join(); // call join 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

クラス

public class Cconnection implements Runnable { 
    Thread runner; 
    ReentrantReadWriteLock readWriteLock; 
    Lock read; 
    Lock write; 

    boolean StopFlag; 
    String header; 
    Socket connection; 
    ServerSocket server; 
    StringBuffer request; 
    OutputStream out; 
    InputStream in; 
    String ClientMessage; 
    public cUsers mPlayerList; 
    public cMessages mPlayersMessages; 
    public Thread MyThread; 

    public Cconnection(String threadName, Socket connection_in , cUsers PlayerList, cMessages PlayerMessages) { 
      connection=connection_in; 

      mPlayerList=PlayerList; 
      mPlayersMessages=PlayerMessages; 

      MyThread = new Thread(this, threadName); // (1) Create a new thread. 

      MyThread.start(); // (2) Start the thread. 
    } 
+0

投稿を修正してください... – L7ColWinters

+0

stacktraceを含めてください。 – mre

答えて

0

私の大きな問題はありますか?メインスレッドからcMyConnection.run()と呼ぶのはなぜですか?

また、メインリファレンスのコードcMyConnectionでも、Cconnectionと表示されます。おそらく問題はcMyConnectionにありますか?それはどのように見えるのですか? cMyConnectionのためのあなたの変数名は、おそらくthreadすべきではない

  • :ここ

    は、あなたの質問についてのいくつかの追加コメントしています。ほとんどの場合、Threadのクラスは混乱した@KLではありません。たぶんconnectionはより良い名前ですか?

  • stackoverflowで質問するときはいつでも、スタックトレースから関連する行を含む例外を投稿する必要があります。これは常に回答者に役立ちます。
  • cMyConnectionクラスにstart()join()メソッドを追加することを検討します。クラスのコンストラクタでスレッドを生成するという考えは、ほんの珍しいことです。少なくとも、javadocsでそれを文書化してください。
1

を行います。 thread.join()を呼び出す前にthread.start()を呼び出さなければなりません。

乾杯あなたがスレッドを使用しているなぜあなたはスレッドを開始し、それが終了するのを待って、その後すぐにされている場合は、

+0

私は少し混乱しています。 –

+0

このスニペットでは、
'cMyConnectionスレッド=新しいcMyConnection("スレッド3 "、接続、mPlayerList、mPlayersMessages); { thread.MyThread.join(); //呼び出しを結合する } catch(InterruptedException e){ e.printStackTrace(); } 'あなたがthread.startが欠落している
()
' cMyConnectionスレッド=新しいcMyConnection( "thread3"、接続、mPlayerList、mPlayersMessages); '** thread.start(); ** ' { thread.MyThreadを試してみてください.join(); //呼び出しを結合する } catch(InterruptedException e){ e.printStackTrace(); } ' – klearn

関連する問題