2013-04-14 70 views
4

假設我想在java中打印文本提示,然後從System.in中獲取用戶的輸入。但另一個線程可以寫入System.out並「取消」輸入,但文本提示保持不變,這是正常的。有沒有辦法讓命令文本跟隨輸入?

輸入輸入的位置 - >
<waiting for input ...>

但是,如果一個線程寫入的東西會發生以下情況:

輸入輸入的位置 - >
...
..
...
線程輸出he再
...
...
<Waits for input here>

有什麼絕招 「綁定」 與提示文本輸入?

回答

2

你可以換你system.outs到日誌類,當你要打印的東西把它添加到隊列中的新日誌類。

當過你要求用戶輸入,已經激活它的日誌類的鎖所以在隊列中任何沒有得到打印,直到用戶輸入被提交,然後在隊列中所有的輸出得到打印。

這將導致所有輸出文本輸入時在即將被暫停,它不會中斷您的輸入,所以輸入會在光標周圍的約束,但你也不會得到任何輸出。如果這是值得的,那就由你決定。

+0

確實,這是我提到的包裝概念的更詳細的描述。 –

+0

謝謝。如果有一個預先存在的會很好,但我沒有親自聽說過。 –

2

有什麼絕招「綁定」與提示文本輸入?

都能跟得上。這是你的代碼;這取決於你自己的合作。這可能意味着在System.(in|out)附近建立(或找到提供)封裝API的包裝,因此您不必擔心意外導致此問題。但是,不,沒有神奇的銀彈。

1

我不確定是否存在任何現有的實現,但該任務應該足夠簡單。

創建一個類,例如SyncConsole,它可以同步打印和讀取。

基本上只有SyncConsole單在你的代碼寫入和讀取到控制檯的IO流。

那麼你的程序可以這樣做

SyncConsole.readInput("Text to display"); 
SyncConsole.print("Text"); 

這些調用然後可以適當地同步,以滿足您的需求。例如,如果某些代碼請求輸入,緩衝區請求打印直到輸入已被接收,等等。

如果您熟悉併發在Java中,這應該是建立非常簡單,給你所期望的行爲。

1
import java.util.LinkedList; 
import java.util.Queue; 

public class MainDemo { 

    public void queueExample() { 

     Queue queue = new LinkedList(); 

     queue.add("Java"); 
     queue.add("DotNet"); 

     queue.offer("PHP"); 
     queue.offer("HTML"); 

     System.out.println("remove: " + queue.remove()); 
     System.out.println("element: " + queue.element()); 
     System.out.println("poll: " + queue.poll()); 
     System.out.println("peek: " + queue.peek()); 

    } 

    public static void main(String[] args) { 
     new MainDemo().queueExample(); 
    } 
} 
+0

整潔,但我不確定這是相關的? – Rup

相關問題