Как использовать службу ExecutorService таким образом, чтобы для приложения на уровне приложения был создан центральный пул потоков, размер пула которого будет установлен в соответствии с количеством потоков, доступным с CPU в то время, а затем разными функциональности приложения используют поток из этого центрального пула в соответствии с их требованием.Java ExecutorService
ответ
Начиная с Java 8, я предлагаю вам использовать ForkJoinPool.commonPool()
. Это единственный глобальный пул потоков, который обеспечивает базовая Java.
Перед Java 8 вы либо сохраняете свой собственный пул потоков, либо используете общий пул (ы) потоков вашей инфраструктуры.
Беллоу мой взгляд:
центральный бассейн Thread?
Возможно, это Singleton Pattern в Дизайн-шаблон, я думаю, он может решить вашу проблему;
установлен в зависимости от количества потоков, доступных с процессором?
Размер пула потоков не является точным. На практике размер зависит от типа задачи, который должен выполняться пулом потоков. Например, размер может быть
Runtime.getRuntime().availableProcessors() + 1
, если задачи Процессор интенсивный, или будетRuntime.getRuntime().availableProcessors() * 2
, если задачи интенсивный ввод-вывод. Но это только основные принципы, вы должны определить соответствующий размер, протестировав приложение с помощью некоторых руководящие принципы (например, Little's_law);мой говорит:
На практике я редко представить все задачи только один центральный threal бассейн, возможно, следует сгруппировать задачи по типу, представить их в другой пул потоков, это будет удобно контролировать или настройка пула потоков позже.
Надеюсь помочь вам.
Спасибо Haolin!Также существует проблема при поиске текущего потока потоков JVM: - Необходимо найти стандартное значение порога Счастливый случай: если количество потоков JVM меньше порогового значения, мы получим поток из пула и обработаем его. Нет проблем в этом случае Печальный случай: если количество потоков JVM больше порогового значения, что здесь делать? Итак, нам нужно подождать, пока нить jvm не остынет. Если мы ждем поток, это слишком дорого с точки зрения использования ЦП. Если мы будем продолжать ждать, то процесс записи накапливается, и снова это будет проблемой с точки зрения производительности. – Man
Используйте некоторую пользовательскую оболочку вокруг «ExecutorService», которая является одноэлементной (возможно, с помощью инъекции зависимостей)? –
Вы можете использовать 'Runtime.getRuntime(). AvailableProcessors();' чтобы вычислить количество процессоров, хотя я бы не рекомендовал использовать это. Лучше профилировать свой код, чтобы найти оптимальное количество потоков. –
Если вы ищете способ расчета количества потоков, поддерживаемых вашей средой, вот некоторые из них: ..http: //stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm- support – Sagar