2009-05-14 69 views
2

我只是想知道如何讓我的Java程序繼續運行,但始終準備好輸入。在沒有程序掛起的Java中輸入?

現在我正在使用一個緩衝區閱讀器並在一行中讀取,但這使得我的程序停止並等待輸入。我希望程序能夠繼續運行,但隨時可以隨時接受輸入,有沒有辦法做到這一點?

回答

9

我希望你將不得不考慮你的應用程序的多線程,以達到你想要的效果。

編輯:當然,雖然這個功能可以通過一個純粹的CLI界面來實現,你可能會更好過研究其他方案(即GUI選項),如果你打算在具有充分反應/事件驅動系統以多線程方式運行。

+0

我發現線程有些複雜,不要因此而氣餒,它絕對是複雜的。如果你這樣做,試試別的東西。 – Organiccat 2009-05-14 15:41:20

+0

我什麼也沒有,只能時間玩耍並學習它,謝謝 – 2009-05-14 15:42:21

+0

關於CLI接口的評論看起來像是一條紅色的鯡魚。完全可以通過一個「CLI界面」程序來處理用戶輸入,同時在後臺執行其他任務。例如,以「頂部」程序爲例。 – 2009-05-14 16:14:37

1

我認爲你的程序將不得不偶爾輪詢用戶輸入。

0

我與詹姆斯同意,另一種方法是「假裝」連續程序運行。這不適用於所有場景,但您可以在顯示用戶輸入之前設置一個計時器,然後計算停止時間和用戶輸入內容時「再次啓動」之間的時間。

使用該時間執行重複函數一定次數。這隻有在你已經有了一些定時器本身時纔會有幫助,例如每隔幾秒鐘就會有一個不斷耗盡的整數。

一個例子:

您詢問用戶的問題,但只希望給他們5秒鐘回答。當用戶回答(命中輸入)時,程序將計算他們輸入的時間,如果時間太長,則輸出一條消息,如果在時間限制內又投了另一條消息。

我只是建議這種方法,因爲線程,這是你真正想進入,是相當先進的。

2

下面是一個多線程命令行界面應用程序如何工作的簡單示例。這不需要輪詢輸入,也不需要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!被輸出到控制檯。