我在 Glassfish v3 中创建了一个专用线程池来处理特定的 HTTP 请求。我想获取任何给定时间点的不活动线程(空闲-未运行)的数量,因为我需要根据工作线程的可用性来限制 HTTP 请求。是否有公开的 API 可以获取此信息?除非线程可用,否则我不想将请求提交到线程池。
最佳答案
回答你的问题:据我所知,没有这样的 API 可以为你提供所需的方便的详细信息,所以我认为你必须自己计算。
对于解决方案部分: java.lang.management
包应该可以帮助您。
java.lang.management.ManagementFactory
ManagementFactory 类是用于获取 Java 平台托管 bean 的工厂类。
您可以考虑使用 ManagementFactory,它可以让您通过公开的 Java 托管 bean 从 JVM 获取详细信息。对于您的情况,您可以使用 ThreadMXBean,它可以让您获取所有 JVM 线程信息。
java.lang.management.ThreadMXBean
Java虚拟机线程系统的管理接口(interface)。
彻底阅读 ThreadMXBean 文档和 API 以很好地理解它,我认为最终您可以使用 java.lang.management.ThreadInfo 对象来获取您需要的所有信息。
java.lang.management.ThreadInfo
java.lang.management.ThreadInfo
为您提供大量线程详细信息,如下所示。我认为没有任何其他 Java 类可以提供这么多有关 Thread 的信息。
- 线程 ID。
- 线程名称。
- 线程状态。
- 由于以下原因而阻塞线程的对象:
- 等待输入同步块(synchronized block)/方法,或者
- 等待在 Object.wait 方法中收到通知,或者
- 由于 LockSupport.park 调用而 parking 。
- 拥有该线程被阻塞的对象的线程的 ID。
- 线程的堆栈跟踪。
- 线程锁定的对象监视器列表。
- 由线程锁定的可拥有同步器列表。
下面是我为您创建的示例,请注意,这是为了帮助您入门,无法提供完整的解决方案,因此请对其进行更多研究,但我认为会有所帮助。
我正在获取所有线程状态并打印它们,因此您可以执行 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}
关于java - 获取 glassfish 上的 HTTP 线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31092144/