2010-01-09 52 views
1

我遇到了一個停止線程在同步塊中的問題。我正在使用TCP套接字。問題是我正在等待一個DataInputStream對象,我想再次創建一個新的套接字,但由於同步塊,它不允許我這樣做。我試過Thread.interrupted()。我無法避免同步塊。有沒有其他方法可以做到這一點?在同步塊中停止線程

dis = new DataInputStream(ReadWriteData.kkSocket.getInputStream()); 
int i = -1; 
String aval = ""; //new String(); 
char c = (char)dis.read(); 

它在dis.read()上被阻止。

當我想創建一個新的套接字時,我應該怎麼做才能逃脫dis.read

在此先感謝。

回答

1

您可以通過調用dis.available()來確定是否有可讀的數據,以確定可以不阻塞地讀取的字節數。

然後使用一些額外的邏輯可以允許創建新的套接字。

1

您可以關閉該流並以此方式捕捉該流,但這可能並不總是最佳選擇。

+0

我相信這是推薦的方法。 – James 2010-01-11 00:14:35

0

如果你知道你要多少流有你可以這樣做:

private static final int N_STREAMS = 3; 
... 
InputStream[] streams = new InputStream[N_STREAMS]; 
List<StringBuilder> outputBuilders = new ArrayList<StringBuilder>(); 
for (int i=0; i < N_STREAMS; i++) { 
    // A StringBuilder for every stream 
    outputBuilder.append(new StringBuilder()); 
    try {   
    streams[i] = new DataInputStream(ReadWriteData.kkSocket.getInputStream()); 
    } catch (IOException e) { 
    // Propagate error or ignore? 
    } 
} 

// Read data 
for (int i=0; i < N_STREAMS; i++) { 
    InputStream currentStream = streams[i]; 
    StringBuilder currentBuilder = outputBuilders.get(i); 
    if (currentStream != null && currentStream.available() > 0) { 
    try { 
     currentBuilder.append(stream.read()); 
    } catch (IOException e) { 
     // Do something 
    } 
    } 
    if (currentStream != null && currentStream??? == EOF) { 
    // I don't know how to detect EOF on this stream... 
    try { 
     streams[i] = null; // Mark it as closed 
     currentStream.close(); 
    } catch (...) { 
     // Do something 
    } 
    } 
} 
// You know have a StringBuilder per socket; do with it what you want 

正如你可能已經注意到,我不知道什麼的Android。但是這似乎足以滿足您的使用習慣,或至少提供一個提示。