java - 获取 glassfish 上的 HTTP 线程数

标签 java multithreading glassfish-3 grizzly

我在 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/

相关文章:

java - 标准绘图中线的长度限制

java - 应用程序在 Intent Activity 之前意外转移到主要 Activity

c - 访问静态初始化变量时是否应该使用屏障?

Java 电子邮件 - 异常服务器不受信任

java - 从服务启动 Activity 不起作用 (Android)

java - 从 Android 列表中启动 Activity

ios - GCD 对比 @synchronized 对比 NSLock

java/swing : gui froze, 没有线程挂起

java - 此 URL 不支持 HTTP 方法 GET,尽管它执行 doGet

jsf-2 - JSF 2 : h:link and getrowdata