线程在同步块中停止

时间:2010-01-09 08:24:15

标签: java android

我遇到了同步块中停止线程的问题。我正在使用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

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以通过调用dis.available()来确定是否有可读取的数据,以确定可以无阻塞地读取的字节数。

然后使用一些额外的逻辑可以创建新套接字。

答案 1 :(得分:1)

您可以关闭该流并以此方式捕获它,但这可能并不总是最佳选择。

答案 2 :(得分: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一无所知。但这似乎足够通用,以适应您的使用,或至少提供一个提示。