一个线程不断读取从BufferedReader
. 数据来自一个SerialPort
。
在主线程上,JMenuItem
单击串行端口时会关闭并且 BufferedReader 应该停止接收消息。
问题是:
如果我在读取消息时尝试关闭,应用程序将卡住并且串行端口不会关闭,直到端口停止发送消息。
所以基本上,我应该在关闭串口之前关闭阅读器。如果我这样做,有时我会得到一个空指针异常,因为我在读取缓冲读取器时关闭了它。
我该如何解决这个问题?
一个线程不断读取从BufferedReader
. 数据来自一个SerialPort
。
在主线程上,JMenuItem
单击串行端口时会关闭并且 BufferedReader 应该停止接收消息。
问题是:
如果我在读取消息时尝试关闭,应用程序将卡住并且串行端口不会关闭,直到端口停止发送消息。
所以基本上,我应该在关闭串口之前关闭阅读器。如果我这样做,有时我会得到一个空指针异常,因为我在读取缓冲读取器时关闭了它。
我该如何解决这个问题?
听起来您可以使用stop
阅读器类中的方法来解决此问题(从菜单项的click
事件中调用)
private boolean isStopped = false;
public void stop() {
isStopped = true;
}
while(bufferedReader.isReady()) {
bufferedReader.read();
if(isStopped) {
bufferedReader.close();
}
}
这样,您可以确保close
在所有read
呼叫完成之前您不会打电话。
最简单的做法是创建一个 SynchronizedReader 类来包装你的BufferedReader
. 但是如果没有更多上下文,我不能保证这会起作用,特别是如果您有调用代码,该代码Reader
对synchronized(reader)
import java.io.IOException;
import java.io.Reader;
import java.nio.CharBuffer;
public class SynchronizedReader extends Reader {
private Reader reader;
public SynchronizedReader(Reader reader) {
super();
this.reader = reader;
}
@Override
public synchronized int read(char[] cbuf, int off, int len) throws IOException {
return reader.read(cbuf, off, len);
}
@Override
public synchronized void close() throws IOException {
reader.close();
}
@Override
public synchronized int hashCode() {
return reader.hashCode();
}
@Override
public synchronized int read(CharBuffer target) throws IOException {
return reader.read(target);
}
@Override
public synchronized int read() throws IOException {
return reader.read();
}
@Override
public synchronized int read(char[] cbuf) throws IOException {
return reader.read(cbuf);
}
@Override
public synchronized boolean equals(Object obj) {
return reader.equals(obj);
}
@Override
public synchronized long skip(long n) throws IOException {
return reader.skip(n);
}
@Override
public synchronized boolean ready() throws IOException {
return reader.ready();
}
@Override
public synchronized boolean markSupported() {
return reader.markSupported();
}
@Override
public synchronized void mark(int readAheadLimit) throws IOException {
reader.mark(readAheadLimit);
}
@Override
public synchronized void reset() throws IOException {
reader.reset();
}
@Override
public synchronized String toString() {
return reader.toString();
}
}