簡體   English   中英

在沒有程序掛起的情況下用Java輸入?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM