[英]Taking input in Java without program hanging?
我只是想知道如何讓我的java程序繼續運行,但總是准備好接受輸入。
現在我正在使用緩沖區讀取器並讀取一行,但這使我的程序暫停並等待輸入。 我希望程序繼續運行但是隨時准備好接受輸入,有沒有辦法做到這一點?
我希望你將不得不考慮多線程你的應用程序,以便按需要運行。
編輯 :當然,雖然這個功能可以通過純粹的CLI界面實現,但如果您打算以多線程方式運行完整的響應/事件驅動系統,那么最好還是探索其他選項(即GUI選項)。
以下是多線程命令行界面應用程序如何工作的快速示例。 這不需要輪詢輸入,也不需要GUI接口,以便在等待來自控制台中的用戶的輸入時在后台執行任務。
在此示例中, Thread
正在后台運行,可以告訴它在稍后的指定秒數內輸出問候語。
public class CommandLineMultiThread
{
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
// Makes and runs the background thread.
MyThread myThread = new MyThread();
Thread t = new Thread(myThread);
t.start();
// Get the number of seconds to wait from the console.
// Exit when "0" is entered.
int waitDuration;
do
{
waitDuration = s.nextInt();
myThread.setGreetIn(waitDuration);
} while (waitDuration != 0);
myThread.quit();
}
static class MyThread implements Runnable
{
boolean running = true; // Boolean to keep thread alive.
long greetingTime = Long.MAX_VALUE; // Time to greet at.
public void setGreetIn(int i)
{
greetingTime = System.currentTimeMillis() + (i * 1000);
}
public void quit()
{
running = false;
}
public void run()
{
while (running)
{
if (System.currentTimeMillis() > greetingTime)
{
System.out.println("Hello!");
greetingTime = Long.MAX_VALUE;
}
try
{
Thread.sleep(100);
}
catch (InterruptedException e) {}
}
}
}
}
Scanner
類可用於通過路由System.in
對象的輸入從命令行界面接受用戶輸入。
然后,當后台線程myThread
正在運行時,主線程正在通過Scanner.nextInt
方法等待來自System.in
的輸入。 一旦等待的秒數被接受,后台線程被告知要等到一定時間,並且一旦到達該時間,問候語Hello!
輸出到控制台。
我認為您的程序將不得不偶爾輪詢用戶輸入。
給它一個漂亮的多線程GUI而不是CLI :)
我同意詹姆斯,另一種選擇是“假裝”連續程序運行。 這不適用於所有場景,但您可以在顯示用戶輸入之前設置計時器,然后在用戶輸入內容時再次計算停止和“開始”之間的時間。
使用該時間執行重復的功能一定次數。 這只有在你已經擁有定時器本身的東西時才有用,比如每隔幾秒就會有一個不斷消耗的整數。
一個例子:
你問用戶一個問題,但只想給他們5秒鍾的答案。 當用戶回答(命中輸入)時,程序將計算他們進入的時間,如果太長,則拋出一條消息,如果在時間限制內則拋出另一條消息。
我只是建議使用這種方法,因為線程是你真正想要進入的,它非常先進。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.