3

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.

1 Answer 1

2

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.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.