获取 glassfish 上的 HTTP 线程数
Get the count of HTTP threads on glassfish
我在 Glassfish v3 中创建了一个专用线程池来处理特定的 HTTP 请求。我想在任何给定时间点获取非活动线程的数量(免费 - 而不是 运行),因为我需要根据工作线程的可用性来限制 HTTP 请求。有没有暴露的API得到这个?除非线程可用,否则我不想将请求提交到线程池。
回答你的问题: 据我所知,没有这样的 API 可以为你提供你需要的方便的细节,所以我认为你有自己计算。
对于解决方案部分: java.lang.management
包应该可以帮助你。
java.lang.management.ManagementFactory
ManagementFactory class 是一个工厂 class,用于为 Java 平台获取托管 bean。
您可以考虑使用 ManagementFactory
,它允许您通过暴露的 Java 托管 bean 从 JVM 获取详细信息。对于您的情况,您可以使用 ThreadMXBean
来获取所有 JVM 线程信息。
java.lang.management.ThreadMXBean
Java 虚拟机线程系统的管理界面。
阅读 ThreadMXBean
文档和 API 彻底理解它,我认为最后你可以使用 java.lang.management.ThreadInfo
对象来获取你需要的所有信息。
java.lang.management.ThreadInfo
java.lang.management.ThreadInfo
为您提供了大量线程详细信息,如下所列。我不认为任何其他 Java class 可以提供这么多关于 Thread 的信息。
- 线程 ID。
- 线程名称。
- 线程状态。
- 线程被阻塞的对象:
- 等待进入同步block/method,或
- 等待在Object.wait方法中得到通知,或
- 因 LockSupport.park 呼叫而停车。
- 拥有线程被阻塞对象的线程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}
我在 Glassfish v3 中创建了一个专用线程池来处理特定的 HTTP 请求。我想在任何给定时间点获取非活动线程的数量(免费 - 而不是 运行),因为我需要根据工作线程的可用性来限制 HTTP 请求。有没有暴露的API得到这个?除非线程可用,否则我不想将请求提交到线程池。
回答你的问题: 据我所知,没有这样的 API 可以为你提供你需要的方便的细节,所以我认为你有自己计算。
对于解决方案部分: java.lang.management
包应该可以帮助你。
java.lang.management.ManagementFactory
ManagementFactory class 是一个工厂 class,用于为 Java 平台获取托管 bean。
您可以考虑使用 ManagementFactory
,它允许您通过暴露的 Java 托管 bean 从 JVM 获取详细信息。对于您的情况,您可以使用 ThreadMXBean
来获取所有 JVM 线程信息。
java.lang.management.ThreadMXBean
Java 虚拟机线程系统的管理界面。
阅读 ThreadMXBean
文档和 API 彻底理解它,我认为最后你可以使用 java.lang.management.ThreadInfo
对象来获取你需要的所有信息。
java.lang.management.ThreadInfo
java.lang.management.ThreadInfo
为您提供了大量线程详细信息,如下所列。我不认为任何其他 Java class 可以提供这么多关于 Thread 的信息。
- 线程 ID。
- 线程名称。
- 线程状态。
- 线程被阻塞的对象:
- 等待进入同步block/method,或
- 等待在Object.wait方法中得到通知,或
- 因 LockSupport.park 呼叫而停车。
- 拥有线程被阻塞对象的线程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}