У меня есть метод в Java, который вызывает несколько других методов. Этот метод вызывается из нескольких потоков в фиксированном пуле потоков. Количество работников совпадает с количеством доступных процессоров (ядер).
public void query() {
method1();
method2();
}
Когда я просматриваю выполнение программы с помощью VisualVM, времена method1()
и method2()
очень короткие, но query()
время очень длительное. Но метод не имеет другого кода, кроме двух вызовов. Там может быть синхронизация внутри method1()
и method2()
, но ничего не видно в коде, которым я управляю.
Когда я уменьшаю количество работников в пуле до 1, это время самопомощи почти исчезло. Как однопоточные, так и многопоточные времена выполнения всей программы практически одинаковы. Я думаю, это означает, что мой метод query()
ждет чего-то.
Нет тупиков, исполнение отлично. Два метода method1()
и method2()
вызывают много других вещей, включая классы библиотек в обфускационных баночках, поэтому мне нелегко его отлаживать. Однако метод query()
вызывается непосредственно из рабочих потоков, используя java.util.concurrent.ExecutorService
.