Java 同步块中的线程停止
我遇到了一个问题,在同步块中有一个停止线程。我正在使用TCP套接字。问题是我正在等待一个Java 同步块中的线程停止,java,android,Java,Android,我遇到了一个问题,在同步块中有一个停止线程。我正在使用TCP套接字。问题是我正在等待一个DataInputStream对象,我想再次创建一个新套接字,但由于同步块的原因,它不允许我这样做 我已尝试使用线程.interrupted()。我无法避免同步块。还有其他方法可以做到这一点吗 dis = new DataInputStream(ReadWriteData.kkSocket.getInputStream()); int i = -1; String aval = ""; //new Strin
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;你想怎么做就怎么做
你可能已经注意到了,我对安卓一无所知。但这似乎足够通用,适合您的使用,或者至少提供了一个提示 我相信这是推荐的方法。