ExecutorService - другой вывод отладки и запуска в Eclipse - PullRequest
2 голосов
/ 08 ноября 2019

Я пишу код, используя Java-фреймворк Executor, и я тестирую свой код на Eclipse, но я увидел странную вещь. Используя режим отладки в Eclipse, я могу печатать на консоли вывод, или, лучше, когда я использую шаг режима отладки в (F5), я могу печатать вывод в консоли, но если я использую режим отладки, используя шаг возврата (F7) или я запускаюприложение, оно ничего не печатает на консоли.

Ниже моего вывода перед с шагом режима отладки в (F5):

mapBuffer 
[[B@1af2d44a, [B@18d87d80, [B@618425b5, [B@58695725, [B@543588e6, [B@f5acb9d, [B@4fb3ee4e]

и после с режимом отладки с возвратом шага (F7) или запустите приложение:

mapBuffer 
[]

С одним и тем же кодом у меня два разных вывода.

public boolean readPieceCount() throws IOException {

        //byte[] buffer = null;
        SortedMap<Integer,byte[]> mapBuffer=new TreeMap<>();    


        ExecutorService executor = Executors.newFixedThreadPool(1);
        executor.submit(() -> {

        for (Integer i=0; i<NUMFILES;i++) 
        {
         Path path = Paths.get(pathPieceCount+"pieceCount"+(i+1)+".csv");
          if(Files.exists(path, LinkOption.NOFOLLOW_LINKS)) 
          {
           byte[] buffer = null;
           try {
            buffer = Files.readAllBytes(path);
                mapBuffer.put(i+1, buffer);
           } catch (IOException e) {
             System.out.println("Exception on readPieceCount!!!");
           }
             }
        }
        });

       System.out.println("mapBuffer ");
       System.out.println(mapBuffer.values());
    executor.shutdown();
/*
more code
*/

это часть моего кода, где у меня проблема.

Я быхотелось бы иметь одинаковый результат во всех режимах. Честно говоря, я провел много времени вчера, но я не понимаю, где ошибаться. Только подтверждение. Когда я запускаю эту часть кода, я всегда получаю одну и ту же последовательность буфера на карте, или исполнитель может изменить последовательность?

Ответы [ 2 ]

3 голосов
/ 08 ноября 2019

Здесь вы имеете дело с параллелизмом, поэтому, по существу, если ваш основной поток достигает строки System.out.println(mapBuffer.values()); до того, как executor.submit(() -> {} будет выполнен с первым mapBuffer.put, вы напечатаете пустой массив. Поместите условие ожидания перед печатью для синхронизации вашего кода, используя ExecutorService.awaitTermination , прежде чем выводить на печать получившиеся SortedMap.

Check Как дождаться завершения всех потоков, используя ExecutorService? для хорошего примера того, как это сделать правильно.

1 голос
/ 08 ноября 2019

Отладка многопоточного приложения не так проста, как однопоточное приложение. Вывод вашего приложения в режиме отладки будет полностью зависеть от того, в каком месте вы поставили точки останова. В режиме отладки, когда он достигает точки отладки, потоки, выполняющие эту часть оператора, будут приостановлены, а другие потоки выполнят и завершат свою работу. Это означает, что все ваше приложение не будет ждать возобновления приостановленных тем. Поскольку в подвешенном потоке может быть несколько потоков, у вас есть проверка, в какой последовательности вы возобновляете потоки, а также возобновляются все потоки или нет.

Сформировав свой код, сложно сказать, какова точная причина вашего вывода, не зная, как именно вы отлаживаете. Но похоже, что ваш основной / родительский поток
печатает mapBuffer значений, прежде чем вы возобновите / запустите / завершите другой поток служб executor.

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