次のような無限ループを破るにはどうすればよいですか。
while(true){
if(???){
break;
}
}
ループするたびに中断して入力を求める必要はありませんか? ループは、ユーザーが中断するまで連続してループする必要があります。
編集
キー入力で壊したい。
次のような無限ループを破るにはどうすればよいですか。
while(true){
if(???){
break;
}
}
ループするたびに中断して入力を求める必要はありませんか? ループは、ユーザーが中断するまで連続してループする必要があります。
編集
キー入力で壊したい。
サイクルを別のスレッドに入れることができます。
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 {
次に、IO 呼び出しを処理するため、 mainが IOException をスローすることを宣言する必要があります。より良いオプションは明らかに例外を正しく処理することですが、これは単純なテストにすぎません。
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();
}
}
あなたの最善の選択肢は、別のスレッドによって制御されるフラグを使用することだと思います。次のようなことができます。
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()」メソッドは実際には必要ありません。スレッドはフラグに直接アクセスできますが、別の場所からスレッドを実行する場合は必要になります。
これを使ったほうがいいです。
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");
}