I created a variation based on this article
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.Callable;
public class ConsoleInputReadTask implements Callable<String> {
private boolean cont = true;
public void stop() {
cont = false;
}
public String call() throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("ConsoleInputReadTask run() called.");
String input;
try {
// wait until we have data to complete a readLine()
while (!br.ready()) {
Thread.sleep(200);
if (!cont) {
System.out.println("ConsoleInputReadTask() stopped");
return null;
}
}
input = br.readLine();
} catch (InterruptedException e) {
System.out.println("ConsoleInputReadTask() cancelled");
return null;
}
return input;
}
}
Part of main program
private ConsoleInputReadTask consoleInputReadTask;
public String readLine() throws InterruptedException {
ExecutorService ex = Executors.newSingleThreadExecutor();
String input = null;
try {
Future<String> result = ex.submit(consoleInputReadTask);
try {
input = result.get();
} catch (ExecutionException e) {
e.getCause().printStackTrace();
}
} finally {
ex.shutdownNow();
}
return input;
}
public void test() {
consoleInputReadTask = new ConsoleInputReadTask();
while ((line = readLine()) != null) {
// ...
}
You can stop consoleInputReadTask
by calling consoleInputReadTask.stop()
in another thread