2014-09-14 2 views
0

Java에서 thread.stop()이 사용되지 않으므로 블로킹 대기를 처리하지 않는 적절한 방법은 무엇입니까?차단 대기중인 스레드를 중지하는 방법은 무엇입니까?

new Thread(){ 
    @Override 
    public void run(){ 
     while(accept){ 
      try { 
       /* attempt to read a single message */ 
       ObjectInputStream is = new ObjectInputStream(s.getInputStream()); 
       Message m = (Message) is.readObject(); 
       /* delegate message to appropriate handler */ 
       MessageDelegator.getInstance().delegate(m); 
      } catch (IOException | ClassNotFoundException ex) { 
      } 
     } 
    } 
}.start(); 

그러나, 여기 청취 과정이 차단되기 때문에 accept=false;을 설정하는 고전적인 트릭하지 않습니다 : 많은 클라이언트와 서버 - 클라이언트 모델을 실행할 때

예를 들어, 같은 내 서버 코드가 보일 수 있습니다 여기에서 일하십시오 (클라이언트는 영원히 아무 것도 보내지 않아서 끊임없이 교수형에 처하게됩니다). thread.stop()을 더 이상 사용할 수 없으면이 스레드를 어떻게 죽일 수 있습니까?

+3

스트림/소켓을 닫습니다. –

+0

스트림을 어떻게 닫아야합니까? 다른 thread로부터 ObjectInputStream에 액세스 가능하게 할까, threadToKill.is = null; 또는 무엇인가를 실시합니까? 아마 너의 제안을 오해하고있을거야. – user1111929

+0

아니요 null에 대한 참조를 설정해도 스트림이 닫히지 않습니다. http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#close%28%29 및 http://docs.oracle.com/javase/7/docs/api를 참조하십시오. /java/net/Socket.html#close%28%29. –

답변

0

찾고 계신 분은 thread.interrupt()입니다.

+0

흠 ...'readObject' doesn InterruptedException을 던져 버리는 것처럼 보입니다. 인터럽트를 수신하지 않는다고 가정합니다. 또는 API에서 이것이 어떻게 작동하는지 어떻게 알 수 있습니까? – user1111929

+0

모르겠지만, IOException을 던지면 놀라지 않을 것입니다. 시도 해봐. 또한 읽고있는 스트림의 구체적인 유형은 무엇입니까? – SLaks

관련 문제