2016-11-24 11 views
2

Как использовать службу ExecutorService таким образом, чтобы для приложения на уровне приложения был создан центральный пул потоков, размер пула которого будет установлен в соответствии с количеством потоков, доступным с CPU в то время, а затем разными функциональности приложения используют поток из этого центрального пула в соответствии с их требованием.Java ExecutorService

+0

Используйте некоторую пользовательскую оболочку вокруг «ExecutorService», которая является одноэлементной (возможно, с помощью инъекции зависимостей)? –

+1

Вы можете использовать 'Runtime.getRuntime(). AvailableProcessors();' чтобы вычислить количество процессоров, хотя я бы не рекомендовал использовать это. Лучше профилировать свой код, чтобы найти оптимальное количество потоков. –

+0

Если вы ищете способ расчета количества потоков, поддерживаемых вашей средой, вот некоторые из них: ..http: //stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm- support – Sagar

ответ

0

Начиная с Java 8, я предлагаю вам использовать ForkJoinPool.commonPool(). Это единственный глобальный пул потоков, который обеспечивает базовая Java.

Перед Java 8 вы либо сохраняете свой собственный пул потоков, либо используете общий пул (ы) потоков вашей инфраструктуры.

0

Беллоу мой взгляд:

  • центральный бассейн Thread?

    Возможно, это Singleton Pattern в Дизайн-шаблон, я думаю, он может решить вашу проблему;

  • установлен в зависимости от количества потоков, доступных с процессором?

    Размер пула потоков не является точным. На практике размер зависит от типа задачи, который должен выполняться пулом потоков. Например, размер может быть Runtime.getRuntime().availableProcessors() + 1, если задачи Процессор интенсивный, или будет Runtime.getRuntime().availableProcessors() * 2, если задачи интенсивный ввод-вывод. Но это только основные принципы, вы должны определить соответствующий размер, протестировав приложение с помощью некоторых руководящие принципы (например, Little's_law);

  • мой говорит:

    На практике я редко представить все задачи только один центральный threal бассейн, возможно, следует сгруппировать задачи по типу, представить их в другой пул потоков, это будет удобно контролировать или настройка пула потоков позже.

Надеюсь помочь вам.

+0

Спасибо Haolin!Также существует проблема при поиске текущего потока потоков JVM: - Необходимо найти стандартное значение порога Счастливый случай: если количество потоков JVM меньше порогового значения, мы получим поток из пула и обработаем его. Нет проблем в этом случае Печальный случай: если количество потоков JVM больше порогового значения, что здесь делать? Итак, нам нужно подождать, пока нить jvm не остынет. Если мы ждем поток, это слишком дорого с точки зрения использования ЦП. Если мы будем продолжать ждать, то процесс записи накапливается, и снова это будет проблемой с точки зрения производительности. – Man