一個線程繼續讀取從BufferedReader
收到的字節。數據來自SerialPort
。如何處理2個線程使用的變量?
在主線程中,點擊時有一個JMenuItem
,串口關閉,BufferedReader應該停止接收消息。
的問題是:
如果我試圖關閉的同時,在閱讀郵件,應用程序將卡和串行端口不會被關閉,直到端口停止發送消息。
所以基本上,我應該在關閉串口前關閉讀卡器。如果我這樣做,有時會得到一個空指針異常,因爲我正在讀取緩衝讀取器時關閉它。
我該如何解決這個問題?
一個線程繼續讀取從BufferedReader
收到的字節。數據來自SerialPort
。如何處理2個線程使用的變量?
在主線程中,點擊時有一個JMenuItem
,串口關閉,BufferedReader應該停止接收消息。
的問題是:
如果我試圖關閉的同時,在閱讀郵件,應用程序將卡和串行端口不會被關閉,直到端口停止發送消息。
所以基本上,我應該在關閉串口前關閉讀卡器。如果我這樣做,有時會得到一個空指針異常,因爲我正在讀取緩衝讀取器時關閉它。
我該如何解決這個問題?
這聽起來像你可以在你的讀者類stop
方法解決這個問題(從菜單項中的click
事件調用)
private boolean isStopped = false;
public void stop() {
isStopped = true;
}
while(bufferedReader.isReady()) {
bufferedReader.read();
if(isStopped) {
bufferedReader.close();
}
}
這樣可以確保你不叫close
直到所有read
電話已完成。
嗯,這工作。謝謝,非常簡單的實現。 – 2013-04-23 13:42:25
最簡單的事情就是創建一個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();
}
}
你關心'BufferedReader'在關閉JMenuItem時讀的是什麼嗎? – supersam654 2013-04-22 20:58:34
@ supersam654是的 – 2013-04-23 13:42:47