0

1 つのスレッドが から受信したバイトを読み取り続けますBufferedReader。データはSerialPort.

メインスレッドでは、JMenuItemクリックするとシリアルポートが閉じられ、BufferedReader がメッセージの受信を停止する必要があります。

問題は:

メッセージの読み取り中に閉じようとすると、アプリケーションが停止し、ポートがメッセージの送信を停止するまでシリアル ポートが閉じられません。

したがって、基本的には、シリアル ポートを閉じる前にリーダーを閉じる必要があります。これを行うと、読み取り中にバッファリングされたリーダーを閉じるため、null ポインター例外が発生することがあります。

この問題を解決するにはどうすればよいですか?

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

最も簡単なことは、あなたのBufferedReader. しかし、コンテキストがなければ、これが機能することを保証できません。特に、複数の相互依存呼び出しを行う呼び出しコードがある場合Reader(その場合、すべての呼び出しが 1 つの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();
    }

}
于 2013-04-22T21:47:32.460 に答える