the following snippet:
public void handleInput() {
Scanner sc = new Scanner(System.in);
int x = 3;
while (true) {
FutureTask<String> readNextLine = new FutureTask<String>(sc::nextLine);
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.execute(readNextLine);
try {
String line = readNextLine.get(x * 1000, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
System.out.println("timed out");
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}
}
will output "timed out" twice which is expected but after that it will loop throwing ExecutionException, stack follows
java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: end
at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:205)
at traceCalls.Trace.handleInput(Trace.java:32)
at main.main(main.java:11)
Caused by: java.lang.IndexOutOfBoundsException: end
at java.base/java.util.regex.Matcher.region(Matcher.java:1515)
at java.base/java.util.Scanner.findPatternInBuffer(Scanner.java:1089)
at java.base/java.util.Scanner.findWithinHorizon(Scanner.java:1791)
at java.base/java.util.Scanner.nextLine(Scanner.java:1649)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
obviously im doing somwthing wrong, but i cant figure out out what.
Scanner class is not threadsafe, as its javadoc says:
A Scanner is not safe for multithreaded use without external synchronization.
So if you really want to read from System.in in multiple threads (and most likely, you don't!), you need to create scanner per thread, or use synchronization.