2012-02-16 24 views
-2

코드를 동기화하기 위해 조인을 사용하려고합니다. 조인을 호출하면 부모와 자식 스레드 모두에서 예외가 발생합니다. 스레드 "thread3"의 예외가 스레드 실행시 예외입니다.자바를 호출 할 때 자식 및 부모 스레드에서 예외가 발생합니다

스레드는 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 클래스가 아닙니다. 어쩌면 connection이 더 좋은 이름일까요?
  • stackoverflow에서 질문 할 때마다 스택 추적에서 관련 줄과 함께 예외를 게시해야합니다. 이것은 항상 응답자를 돕습니다.
  • cMyConnection 클래스에 start()join() 메서드를 추가하는 것이 좋습니다. 클래스의 생성자에서 스레드를 포크한다는 생각은 조금 이상합니다. 최소한 javadocs에서 문서화해야한다.
1

을한다. thread.join()을 호출하기 전에 thread.start()를 호출해야합니다.

건배,

+0

나는 약간 혼란 스럽다. –

+0

이 스 니펫에서 :
'cMyConnection thread = new cMyConnection ("thread3", connection, mPlayerList, mPlayersMessages); try { thread.MyThread.join(); // call join } catch (InterruptedException e) { e.printStackTrace(); }'당신이 thread.start 누락
()
'cMyConnection 스레드 = 새 cMyConnection ("thread3", 연결, mPlayerList, mPlayersMessages)'** thread.start(); ** '{ thread.MyThread 시도 .어울리다(); // call join } catch (InterruptedException e) { e.printStackTrace(); }' – klearn

관련 문제