簡體   English   中英

Java輸入無需暫停

[英]Java input without pausing

我如何在不暫停代碼的情況下為程序制作一個控制台? 例如,我有一個循環需要保持運行,但是當我在控制台中輸入命令時,我希望游戲檢查該命令是什么並在循環中對其進行處理。 循環不應該等待命令,而應該使用if語句檢查隊列中是否有命令。

順便說一句,如果有幫助,我正在制造一台專用服務器。

有一個非常明顯的方法:使用專用線程等待InputStream,從中讀取事件/命令,然后將它們傳遞到隊列中。

您的主線程將定期檢查此隊列。 每次檢查后,它都將處理隊列中的命令,或者如果它為空,則繼續執行該操作。

您想要的是一個線程,您可以在其中保持命令的運行狀態。 它可能看起來像這樣:

class ReadCommand implements Runnable
{
    public void run()
    {
       // Command reading logic goes here
    }
}

在運行其余代碼的“主”線程中,您必須像這樣啟動它:

new Thread(new ReadCommand())).start()

另外,您需要在某處放置一個命令隊列,該隊列由ReadCommand填充並從其他代碼讀取。 我建議您閱讀有關並發Java編程的手冊。

讓它們在兩個單獨的線程中運行。

class Server {

    public static void main(String[] args) {
        InputThread background = new InputThread(this).start();
        // Run your server here
    }
}

class InputThread {
    private final Server server;
    public InputThread(Server server) {
        this.server = server;
    }

    public void run() {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()) {
            // blocks for input, but won't block the server's thread
        }
    }
}

服務器應在其自己的線程中運行。 這將允許循環運行而不會暫停。 您可以使用隊列將命令傳遞到服務器。 每次通過循環,服務器都可以檢查隊列並處理一個或多個命令。 然后,命令行可以根據自己的時間表將命令提交到隊列中。

您可以在控制台中的單獨線程中進行讀取。 這意味着您的主線程不必等待控制台。

甚至服務器應用程序也可以具有Swing GUI。 ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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