2015-06-27 3 views
0

Я создал выделенный пул потоков для обработки определенных HTTP-запросов в Glassfish v3. Я хотел бы получить количество неактивных потоков (free-not running) в любой заданный момент времени, поскольку мне нужно дросселировать HTTP-запросы в зависимости от доступности рабочих потоков. Есть ли открытый API, чтобы получить это? Я не хочу отправлять запрос в пул потоков, если потоки не доступны.Получить количество потоков HTTP на стеклянную рыбку

ответ

1

Чтобы ответить на ваш вопрос: Насколько я знаю, такой 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} 
+0

@VishalP Любые новости? – hagrawal

 Смежные вопросы

  • Нет связанных вопросов^_^