Почему take (). Get () в ExecutorCompletionService в асинхронных задачах отнимает много времени, чтобы 'take ()' из своего первого завершенного потока? - PullRequest
0 голосов
/ 08 июня 2019

Я использовал ExecutorCompletionService для вызова веб-службы.Веб-сервис, к которому обращаются потоки, возвращает ответ в течение 5 секунд.Ноодействие завершенияService.take (). Get () занимает почти 30 секунд, чтобы получить результаты из самого первого завершенного потока;тогда как завершениеService.take (). get () занимает 6 секунд, чтобы получить результаты из других завершенных потоков.

Мне известно о ExecutorCompletionService, что он принимает (). get () задачу, которая сначала выполняется, ине тот, который представлен первым.Но я не могу понять, почему для получения результатов из первого завершенного потока требуется так много времени (30 секунд +).И почему другие потоки, которые утверждают в консоли, что на их завершение ушло 6 секунд, не принимают take (). Get () для обработки первыми, а поток занимает более 30 секунд.

Изначально я начал использоватьExecutorService только с Future, но затем я переключился на ExecutorCompletionService, чтобы получить лучшее время отклика.Но время отклика не меняется.Помимо основного кода, я также пытался добавить задачи в Future с ExecutorCompletionService, но ничего не изменилось:

CompletionService executorCompletionService = new ExecutorCompletionService<>(executorService);
    List<Future<List<Students>>> futures = new ArrayList<Future<Students>>();
    for(..)
        {
        future.add(mytasks);
        }

    for(
    int i = 0;i<futures.size();i++)
    {
        List<Students> result = executorCompletionService.take().get();
        // Some processing here
    }

    ExecutorService executorService = Executors.newFixedThreadPool(4, new ThreadFactory("myThreads"));

    CompletionService<List<Students>> completionService = new ExecutorCompletionService<>(executorService);for(
    int i = 0;i<4;i++)
    {

        int thread = i;
        completionService.submit(new Callable<List<Students>>() {
            public List<Students> call() throws Exception {
                List myList = (List<Students>) anotherApi.seviceCall(Object);
                Students st = new Students();
                st.setId(thread);
                st.setName1("I am thread-----");
                myList.add(st);
                return list;
            }
        });
    }

    for(
    int i = 0;i<4;i++)
    {
        long startTimeOfReadingThread = System.currentTimeMillis(); // start
                                                                    // time of
                                                                    // reading
                                                                    // result
                                                                    // set of
                                                                    // thread
        List<Students> students = completionService.take().get();
        for (Students c : student) {
            if (c.getName() != null && c.getName() != "" && c.getName1().equals("I am thread-----"))
                System.out.println("I am thread-----" + c.getId());
        }

        long endTimeOfReadingThread = System.currentTimeMillis(); // end time
                                                                    // when
                                                                    // result
                                                                    // set of
                                                                    // thread is
                                                                    // read

        System.out.println(
                "time in threads&&&&&&&&*****" + ((endTimeOfReadingThread - startTimeOfReadingThread) / 1000F));

        response.addAll(students);
    }executorService.shutdown();

Время отклика от консоли системы в секундах:

I am thread-----3
time in threads&&&&&&&&*****29.703
I am thread-----0
time in threads&&&&&&&&*****7.987
I am thread-----1
time in threads&&&&&&&&*****6.001
I am thread-----2
time in threads&&&&&&&&*****6.563

Пожалуйста, помогитеЯ исправляю все, что я делаю неправильно.Я знаю только, что, если 4 потока идут параллельно с использованием Executor Completion Service, а другой обслуживаемый сервис не занимает более 5-6 секунд для одного потока, то мой первый завершенный поток не должен занимать более 6-7 секунд (простокак и другие темы).

Это приводит к тому, что общее время ответа пользователю составляет почти 33 секунды.

...