2013-10-21 77 views
0

連續循環如何打破無窮大循環,像這樣的?循環必須循環連續直到用戶將其分開。打破與關鍵

編輯

我想用一個鍵輸入來打破它。

+3

您不能在不中斷程序的情況下中斷程序。 – Maroun

+1

您認爲如果不檢查它,您將能夠檢測到「一鍵輸入」,怎麼樣? – chrylis

+0

我的意思是我不想在每次循環時都打斷循環,我不希望循環等待繼續鍵或休息鍵,我只是想用一個鍵來中斷正在進行的循環。 – theva

回答

0

您可以將循環放入單獨的線程中。

import java.*; 
import java.io.*; 

class Main { 

     public static void main(String[] args) throws IOException { 

       Thread t = new Thread(new Runnable() { 
         public void run() { 
           int cnt = 0; 

           while (true) { 
             System.out.println(cnt); 
             ++cnt; 
           } 
         } 
       }); 

       t.start(); 
       System.in.read(); 
       t.stop(); 
     } 
} 

讓我們逐行分析;首先進口:

import java.*; 
import java.io.*; 

class Main { 

然後,我們需要聲明主要拋出IOException異常,因爲我們將處理IO要求;顯然,更好的選擇是正確處理異常,但這只是一個簡單的測試。

 public static void main(String[] args) throws IOException { 

然後我們創建一個執行無限循環的線程;我們不會從這個線程進行IO調用。直到我們調用Thread.start(),並且直到我們撥打Thread.stop()纔開始線程。

   Thread t = new Thread(new Runnable() { 
         public void run() { 
           int cnt = 0; 

           while (true) { 
             System.out.println(cnt); 
             ++cnt; 
           } 
         } 
       }); 

現在我們開始線程;這個調用後的行將繼續與線程同時執行,所以我們將能夠等待用戶輸入並停止線程。

   t.start(); 
       System.in.read(); 
       t.stop(); 
     } 
} 
+0

這似乎工作,太棒了!唯一的一點是Java給出了一個關於Thread.stop的通知已被棄用,但它的工作原理! – theva

+1

不客氣!看起來答案是由不關心提供解釋的人下調的;我相信這是由於我提供的解決方案是一個異步取消的典型實例,** stop **實際上在Java中已棄用。通常,您應該使用同步和線程共享變量來編排線程的終止,並精確選擇應該終止的正確時刻。我不能保證弗朗西斯的答案是正確的,我沒有測試過,但你應該看看它,看看我在說什麼。 – damix911

-2

最好使用這個。

boolean doLoop = true; 

while(doLoop){ 

    if(userTerminates()){ //user terminates it? 
     doLoop = false; 
    } 
} 

private boolean userTerminates(){ 
    Scanner scanner = new Scanner(System.in); 

    //If you want that user terminates it with 'c' char 
    return scanner.nextLine().equals("c"); 
} 
+0

Java中沒有'bool'這樣的東西。 – Vallentin

+0

假設在Java中存在'bool',這是如何回答這個問題的? – Maroun

+0

@Vallentin來花花公子!它是布爾數據類型 –

0

你可以有一個public可變running

public static boolean running = true; 

根據您要關閉它是什麼,你只是while循環中檢查這一點。假設你想保持循環運行,而JFrame可見。然後你只是讓你的循環看起來像這樣。

while (running) { 
    // Do stuff 
    running = frame.isVisible(); // Where frame is a JFrame instance. 
} 

或者你可以這樣做,沒有變量。

while (true) { 
    // Do stuff 
    if (!frame.isVisible()) { 
     break; 
    } 
} 
1

我認爲你最好的選擇是使用由另一個線程控制的標誌。你可以這樣做:

private volatile boolean keepRunning = true; 

public synchronized void stopRunning() { 
    keepRunning = false; 
} 

public void someProcess() { 
    new Thread() { 
     public void run() { 
      try (Scanner scanner = new Scanner(System.in)) { 
       keepWaiting = true; 
       while(keepWaiting) { 
        String userInput = scanner.next(); 
        if("s".equals(userInput)) { 
         stopRunning(); 
         keepWaiting = false; 
        } 
       } 
      } 
     } 
    }.start(); 

    while(keepRunning){ 
     doWork(); 
    } 
} 

循環應該保持運行,直到用戶輸入「s」。當然這是一個非常基本的實現,但你明白了。另外,你並不需要「stopRunning()」方法,該線程可以直接訪問該標誌,但如果你想從其他地方運行線程,則需要它。