Future task throws ExecutionException caused by IndexOutOfBoundsExceptionwhile I, to the best of my knowledge am using no array

victor gauzzi :

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.

Dmitry Pisklov :

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.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=300269&siteId=1