Я создал выделенный пул потоков для обработки определенных HTTP-запросов в Glassfish v3. Я хотел бы получить количество неактивных потоков (free-not running) в любой заданный момент времени, поскольку мне нужно дросселировать HTTP-запросы в зависимости от доступности рабочих потоков. Есть ли открытый API, чтобы получить это? Я не хочу отправлять запрос в пул потоков, если потоки не доступны.Получить количество потоков HTTP на стеклянную рыбку
ответ
Чтобы ответить на ваш вопрос: Насколько я знаю, такой API не существует, поэтому вы можете получить нужные вам удобные данные, поэтому я думаю, что вы должны сами его вычислить.
Для решения проблемы:java.lang.management
пакет должен вам помочь.
java.lang.management.ManagementFactory
ManagementFactory класс является классом фабрики для получения управляемых бобов для платформы Java.
Вы можете использовать ManagementFactory
, который позволяет вам получать детали из JVM через открытые Java-управляемые компоненты. В вашем случае вы можете использовать ThreadMXBean
, который позволит вам получить всю информацию о потоке JVM.
java.lang.management.ThreadMXBean
Интерфейс управления для системы потока виртуальной машины Java.
Прочитайте ThreadMXBean
документацию и API, чтобы понять это хорошо, и я думаю, что в конце вы можете использовать объект java.lang.management.ThreadInfo
, чтобы получить всю необходимую информацию.
java.lang.management.ThreadInfo
java.lang.management.ThreadInfo
получает вас много подробностей темы, которые перечислены ниже. Я не думаю, что какой-либо другой класс Java может дать эту информацию о Thread.
- Идентификатор темы.
- Название темы.
- Состояние резьбы.
- Объект, на котором поток блокируется из-за:
- ждет, чтобы ввести блок синхронизации/метод, или
- ждет, чтобы получать уведомления в Object.wait метода или
- парковки вследствие вызов LockSupport.park.
- Идентификатор потока, которому принадлежит объект, который заблокирован потоком.
- Стек следа нити.
- Список объектных мониторов, заблокированных нитью.
- Список контролируемых синхронизаторов, заблокированных потоком.
Ниже приведен образец, который я создал для вас, обратите внимание, что это поможет вам начать работу, и полноценное решение не может быть предоставлено, поэтому, пожалуйста, сделайте больше исследований об этом, но я думаю, было бы полезно.
Я получаю все состояния потоков и их печать, поэтому вы можете делать IF-ELSE, а затем подготовить список чего-то, основанного на состоянии и т. Д., А затем предпринять необходимые действия.
Надеюсь, это поможет!
private static void getThreadInfo() {
System.out.println("Started");
ThreadMXBean managementFactory = ManagementFactory.getThreadMXBean();
long threadIds[] = managementFactory.getAllThreadIds();
for (int i = 0; i < threadIds.length; i++) {
ThreadInfo info = managementFactory.getThreadInfo(threadIds[i]);
System.out.println("Thread name = " + info.getThreadName() + " Thread id = " + info.getThreadId() + " Thread state = " + info.getThreadState());
}
System.out.println("#############");
System.out.println(Thread.currentThread().getAllStackTraces());
}
Выход:
Started
Thread name = Attach Listener Thread id = 5 Thread state = RUNNABLE
Thread name = Signal Dispatcher Thread id = 4 Thread state = RUNNABLE
Thread name = Finalizer Thread id = 3 Thread state = WAITING
Thread name = Reference Handler Thread id = 2 Thread state = WAITING
Thread name = main Thread id = 1 Thread state = RUNNABLE
#############
{Thread[Finalizer,8,system]=[Ljava.lang.StackTraceElement;@1748ba4, Thread[Attach Listener,5,system]=[Ljava.lang.StackTraceElement;@7bd86d, Thread[main,5,main]=[Ljava.lang.StackTraceElement;@bdff3b, Thread[Reference Handler,10,system]=[Ljava.lang.StackTraceElement;@1bf8a41, Thread[Signal Dispatcher,9,system]=[Ljava.lang.StackTraceElement;@dd841}
@VishalP Любые новости? – hagrawal