2012-04-26 60 views
1

只有一個線程正在創建。在某些情況下,它需要關閉。 在這種情況下,可以通過檢查isInterrupted()來完成。但是如果有空的InputStream,它會在in.readUTF()上凍結。這可以如何解決?線程從空DataInputStream凍結readUTF

DataInputStream in; 
.... 
public void stop() { 
thread.interrupt(); 
} 

public void run() { 
    while(true) { 
          String str = in.readUTF();  // locking here, when stream is empty 
          S.o.p(str) 
          if(isInterrupted) { 
          return; 
       }} 
} 

public void main(String args[]) { 
     Thread thread = new Thread();       
} 
+0

你必須:中斷線程。關閉流,設置socket.setSoTimeout(如果工作瓦特/套接字)或任何其他可用的超時(這可能會轉化爲某些時候)...或者只是去非阻塞IO。 – bestsss 2012-04-26 12:03:08

回答

2

您不能中斷阻塞的InputStream。 (這是與NIO的區別之一)您可以在調用中斷之前關閉流,這將觸發IOException。

public void stop() { 
    in.close(); // or use something like IOUtils.closeQuietly(in); 
    thread.interrupt(); 
} 
+0

並非每個流都支持異步。關閉,如果他們支持,他們應該也支持線程中斷。任何人都可以安裝一個異步處理程序thread.interrupt – bestsss 2012-04-26 12:13:00

+0

@bestsss我已經看過使用異步處理程序,但它似乎是一個黑色的藝術(使用內部唯一的API)你知道任何關於如何使用pupple使用API​​的文章? – 2012-04-26 12:18:38

+0

是的。它是公開的,官方的API,我甚至發佈過一次。需要找到它。反正:* java.nio.channels.spi.AbstractInterruptibleChannel.implCloseChannel *。奇怪的地方,但它是一個官方的API。不,Java的祕密或反思。鏈接:http://stackoverflow.com/questions/7889161/detecting-thread-interruption-with-jna-native-wait-call-windows – bestsss 2012-04-26 12:23:01