Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步块中的线程停止_Java_Android - Fatal编程技术网

Java 同步块中的线程停止

Java 同步块中的线程停止,java,android,Java,Android,我遇到了一个问题,在同步块中有一个停止线程。我正在使用TCP套接字。问题是我正在等待一个DataInputStream对象,我想再次创建一个新套接字,但由于同步块的原因,它不允许我这样做 我已尝试使用线程.interrupted()。我无法避免同步块。还有其他方法可以做到这一点吗 dis = new DataInputStream(ReadWriteData.kkSocket.getInputStream()); int i = -1; String aval = ""; //new Strin

我遇到了一个问题,在同步块中有一个停止线程。我正在使用TCP套接字。问题是我正在等待一个
DataInputStream
对象,我想再次创建一个新套接字,但由于同步块的原因,它不允许我这样做

我已尝试使用
线程.interrupted()
。我无法避免同步块。还有其他方法可以做到这一点吗

dis = new DataInputStream(ReadWriteData.kkSocket.getInputStream());
int i = -1;
String aval = ""; //new String();
char c = (char)dis.read();
它在
dis.read()
上被阻止

当我想要创建一个新的套接字时,我应该做什么来转义
dis.read


提前感谢。

您可以随时通过调用
dis.available()
来检查是否有可读取的数据,以确定可以在不阻塞的情况下读取的字节数


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

您可以关闭流并以这种方式捕获它,但这可能不是最好的选择。

如果您知道要拥有多少流,可以执行以下操作:

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
private static final int N_STREAMS=3;
...
InputStream[]streams=新的InputStream[N_streams];
List outputBuilders=new ArrayList();
对于(int i=0;i0){
试一试{
currentBuilder.append(stream.read());
}捕获(IOE异常){
//做点什么
}
}
如果(currentStream!=null&¤tStream???==EOF){
//我不知道如何检测这个流上的EOF。。。
试一试{
streams[i]=null;//将其标记为已关闭
currentStream.close();
}捕获(…){
//做点什么
}
}
}
//您知道,每个套接字都有一个StringBuilder;你想怎么做就怎么做

你可能已经注意到了,我对安卓一无所知。但这似乎足够通用,适合您的使用,或者至少提供了一个提示

我相信这是推荐的方法。