Будущая задача создает исключение ExecutionException, вызванное IndexOutOfBoundsException, в то время как я, насколько я знаю, не использую массив - PullRequest
2 голосов
/ 17 марта 2020

следующий фрагмент:

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();
            }
        }
    }

будет выдавать "тайм-аут" в два раза больше ожидаемого, но после этого будет oop, выбрасывая ExecutionException, стек следует

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)

, очевидно, я делаю что-то не так, но я не могу понять, что.

1 Ответ

2 голосов
/ 18 марта 2020

Класс сканера не является потокобезопасным, так как его javado c говорит:

Сканер не безопасен для многопоточного использования без внешней синхронизации.

Так что если вы вы действительно хотите читать из System.in в несколько потоков (и, скорее всего, нет!), вам нужно создать сканер для каждого потока или использовать синхронизацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...