假設我想在java中打印文本提示,然後從System.in中獲取用戶的輸入。但另一個線程可以寫入System.out並「取消」輸入,但文本提示保持不變,這是正常的。有沒有辦法讓命令文本跟隨輸入?
輸入輸入的位置 - >
<waiting for input ...>
但是,如果一個線程寫入的東西會發生以下情況:
輸入輸入的位置 - >
...
..
...
線程輸出he再
...
...
<Waits for input here>
有什麼絕招 「綁定」 與提示文本輸入?
假設我想在java中打印文本提示,然後從System.in中獲取用戶的輸入。但另一個線程可以寫入System.out並「取消」輸入,但文本提示保持不變,這是正常的。有沒有辦法讓命令文本跟隨輸入?
輸入輸入的位置 - >
<waiting for input ...>
但是,如果一個線程寫入的東西會發生以下情況:
輸入輸入的位置 - >
...
..
...
線程輸出he再
...
...
<Waits for input here>
有什麼絕招 「綁定」 與提示文本輸入?
你可以換你system.outs到日誌類,當你要打印的東西把它添加到隊列中的新日誌類。
當過你要求用戶輸入,已經激活它的日誌類的鎖所以在隊列中任何沒有得到打印,直到用戶輸入被提交,然後在隊列中所有的輸出得到打印。
這將導致所有輸出文本輸入時在即將被暫停,它不會中斷您的輸入,所以輸入會在光標周圍的約束,但你也不會得到任何輸出。如果這是值得的,那就由你決定。
有什麼絕招「綁定」與提示文本輸入?
都能跟得上。這是你的代碼;這取決於你自己的合作。這可能意味着在System.(in|out)
附近建立(或找到提供)封裝API的包裝,因此您不必擔心意外導致此問題。但是,不,沒有神奇的銀彈。
我不確定是否存在任何現有的實現,但該任務應該足夠簡單。
創建一個類,例如SyncConsole,它可以同步打印和讀取。
基本上只有SyncConsole單在你的代碼寫入和讀取到控制檯的IO流。
那麼你的程序可以這樣做
SyncConsole.readInput("Text to display");
SyncConsole.print("Text");
這些調用然後可以適當地同步,以滿足您的需求。例如,如果某些代碼請求輸入,緩衝區請求打印直到輸入已被接收,等等。
如果您熟悉併發在Java中,這應該是建立非常簡單,給你所期望的行爲。
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();
}
}
整潔,但我不確定這是相關的? – Rup
確實,這是我提到的包裝概念的更詳細的描述。 –
謝謝。如果有一個預先存在的會很好,但我沒有親自聽說過。 –