2013-04-22 61 views
0

一個線程繼續讀取從BufferedReader收到的字節。數據來自SerialPort如何處理2個線程使用的變量?

在主線程中,點擊時有一個JMenuItem,串口關閉,BufferedReader應該停止接收消息。

的問題是:

如果我試圖關閉的同時,在閱讀郵件,應用程序將卡和串行端口不會被關閉,直到端口停止發送消息。

所以基本上,我應該在關閉串口前關閉讀卡器。如果我這樣做,有時會得到一個空指針異常,因爲我正在讀取緩衝讀取器時關閉它。

我該如何解決這個問題?

+1

你關心'BufferedReader'在關閉JMenuItem時讀的是什麼嗎? – supersam654 2013-04-22 20:58:34

+0

@ supersam654是的 – 2013-04-23 13:42:47

回答

1

這聽起來像你可以在你的讀者類stop方法解決這個問題(從菜單項中的click事件調用)

private boolean isStopped = false; 

public void stop() { 
    isStopped = true; 
} 

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

這樣可以確保你不叫close直到所有read電話已完成。

+0

嗯,這工作。謝謝,非常簡單的實現。 – 2013-04-23 13:42:25

0

最簡單的事情就是創建一個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(); 
    } 

}