0

一个线程不断读取从BufferedReader. 数据来自一个SerialPort

在主线程上,JMenuItem单击串行端口时会关闭并且 BufferedReader 应该停止接收消息。

问题是:

如果我在读取消息时尝试关闭,应用程序将卡住并且串行端口不会关闭,直到端口停止发送消息。

所以基本上,我应该在关闭串口之前关闭阅读器。如果我这样做,有时我会得到一个空指针异常,因为我在读取缓冲读取器时关闭了它。

我该如何解决这个问题?

4

2 回答 2

1

听起来您可以使用stop阅读器类中的方法来解决此问题(从菜单项的click事件中调用)

private boolean isStopped = false;

public void stop() {
    isStopped = true;
}

while(bufferedReader.isReady()) {
    bufferedReader.read();
    if(isStopped) {
        bufferedReader.close();
    }
}

这样,您可以确保close在所有read呼叫完成之前您不会打电话。

于 2013-04-22T21:09:51.153 回答
0

最简单的做法是创建一个 SynchronizedReader 类来包装你的BufferedReader. 但是如果没有更多上下文,我不能保证这会起作用,特别是如果您有调用代码,该代码Readersynchronized(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();
    }

}
于 2013-04-22T21:47:32.460 回答