2011-08-12 26 views
2

我的一個線程被丟棄(以Java語言)的控制檯輸出出現問題。情況如下:我生成一個線程,偵聽傳入消息(使用阻塞方法)。這些消息然後異步寫入控制檯。同時,我通過System.console().readLine()在控制檯上讀取用戶輸入。從另一個線程的Java控制檯輸出丟失

問題是文本永遠不會寫入控制檯。我的意思是,因爲readLine()方法被阻塞,所以我希望控制檯至少能夠在主線程輸入內容時顯示已寫入控制檯的輸出。或者我在這裏忽略了這一點?

相關來源是

// ... 

// handle receiving messages 
(new Thread() { 
    @Override 
    public void run() { 
     while (executing) received(new String(subSocket.recv(0))); 
    } 
}).start(); 

// ... 

String input; 
try { 
    while ((input = System.console().readLine()) != null && !input.equals(".")) { 
     pubSocket.send(input.getBytes(), 0); 
     Thread.yield(); 
    } 
} 
catch (Exception ex) { } 
finally {executing = false;} 

和接收的方法是

public void received(String s) { 
    System.console().format("(%s)", s); 
    System.console().flush(); 
} 

我在做什麼錯?還是有更好的方法來做到這一點?我的意思是,我試圖用一個BufferedReader爲了封裝輸入流中讀取它面向行及其所使用的System.out.format()沿..達到同樣的效果 - 沒有什麼:(

乾杯, FXX

+0

當您寫入System.out時,您並未寫入控制檯表示的流,您正在寫入標準輸出,並且System.console對象表示標準輸入,它們並不相同。 –

回答

0

試試像,

  • 實現一個線程從輸入到讀取並存儲在同步化地圖/向量/列表等。
  • 另一個線程正在監聽該集合,然後將處理該消息。

我認爲這應該有助於某種方式......主要的是,不要在系統輸入上運行循環。試一試。

+1

Thx的幫助..我嘗試了使用BlockingQueue,但它沒有工作,是什麼讓我瘋狂。然後我轉向其他一些東西,當我回來時,我意識到我沒有正確初始化執行標誌,愚蠢的我!我猜這只是這些日子中的一個...... :(。執行標誌設置,它的工作原理與預期的一樣 - 你實際上不需要在線程之間共享一些隊列或其他東西,但是無論如何再次感謝.. – fxx

+0

@fxx:如果你有機會,你能更新你的代碼來包含解決方案,或自己回答問題嗎?謝謝!:) –

相關問題