2015-06-27 31 views
0

我已經創建了專用線程池來處理Glassfish v3中的特定HTTP請求。我想在任何給定的時間點獲得不活動線程的數量(free-not running),因爲我需要根據工作線程的可用性來限制HTTP請求。有沒有暴露的API來獲得這個?除非線程可用,否則我不想將請求提交給線程池。獲取glassfish上的HTTP線程數

回答

1

回答你的問題:根據我所知,沒有這樣的API可以給你提供你需要的方便的細節,所以我認爲你必須自己計算它。

對於解決方案部分:java.lang.management包應該可以幫到你。

java.lang.management.ManagementFactory
的ManagementFactory類是獲得託管Bean針對Java平臺的工廠類。
您可以考慮使用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類可以提供有關Thread的更多信息。

  • 線程ID。
  • 線程的名稱。
  • 線程狀態。
  • 在其上線程被阻塞由於該目的:
    • 等待進入同步塊/方法,或
    • 等待在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} 
+0

@VishalP任何消息? – hagrawal