Я использовал 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 секунды.