我遇到了同步块中停止线程的问题。我正在使用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
?
提前致谢。
答案 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一无所知。但这似乎足够通用,以适应您的使用,或至少提供一个提示。