最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

tomcat獲取執(zhí)行的線程池信息和線程堆棧的方法詳解

 更新時(shí)間:2023年11月29日 08:21:20   作者:冒泡的肥皂  
這篇文章主要給大家介紹了tomcat獲取執(zhí)行的線程池信息和線程堆棧的方法,文章通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

最近打算還是了解點(diǎn)java吧,搞點(diǎn)小demo。

想了解的知識(shí)點(diǎn):

  • 數(shù)據(jù)請(qǐng)求的堆棧,因?yàn)橛龅竭^(guò)數(shù)據(jù)庫(kù)鎖表需要定位。(今天做點(diǎn)記錄,但有點(diǎn)不完美)
  • 想得到數(shù)據(jù)庫(kù)連接沒(méi)釋放的那個(gè)線程堆棧。
  • 找個(gè)access訪問(wèn)記錄的排序工具類(lèi)。

線程池信息獲取

  • 線程池信息獲取或者告警可以用 dynamic-tp
  • 獲取tomcat的線程信息可以用下面的代碼
//獲取webServer線程池
ThreadPoolExecutor executor = (ThreadPoolExecutor) ((TomcatWebServer) applicationContext.getWebServer())
        .getTomcat()
        .getConnector()
        .getProtocolHandler()
        .getExecutor();
Map<String, String> returnMap = new LinkedHashMap<String, String>();
returnMap.put("核心線程數(shù)", String.valueOf(executor.getCorePoolSize()));
returnMap.put("最大線程數(shù)", String.valueOf(executor.getMaximumPoolSize()));
returnMap.put("活躍線程數(shù)", String.valueOf(executor.getActiveCount()));
returnMap.put("池中當(dāng)前線程數(shù)", String.valueOf(executor.getPoolSize()));
returnMap.put("歷史最大線程數(shù)", String.valueOf(executor.getLargestPoolSize()));
returnMap.put("線程允許空閑時(shí)間/s", String.valueOf(executor.getKeepAliveTime(TimeUnit.SECONDS)));
returnMap.put("核心線程數(shù)是否允許被回收", String.valueOf(executor.allowsCoreThreadTimeOut()));
returnMap.put("提交任務(wù)總數(shù)", String.valueOf(executor.getSubmittedCount()));
returnMap.put("歷史執(zhí)行任務(wù)的總數(shù)(近似值)", String.valueOf(executor.getTaskCount()));
returnMap.put("歷史完成任務(wù)的總數(shù)(近似值)", String.valueOf(executor.getCompletedTaskCount()));
returnMap.put("工作隊(duì)列任務(wù)數(shù)量", String.valueOf(executor.getQueue().size()));
returnMap.put("拒絕策略", executor.getRejectedExecutionHandler().getClass().getSimpleName());
System.out.println(returnMap);

獲取tomcat的線程堆棧信息

首先需要了解下線程的狀態(tài):

1.NEW(創(chuàng)建)創(chuàng)建態(tài):當(dāng)一個(gè)已經(jīng)被創(chuàng)建的線程處于未被啟動(dòng)時(shí),即:還沒(méi)有調(diào)用start方法時(shí),就處于這個(gè)狀態(tài)。

2.RUNNABLE(運(yùn)行時(shí))運(yùn)行態(tài):當(dāng)線程已被占用,在Java虛擬機(jī)中正常執(zhí)行時(shí),就處于此狀態(tài)。

3.BLOCKED(排隊(duì)時(shí))阻塞態(tài):當(dāng)一個(gè)線程試圖獲取一個(gè)對(duì)象鎖,而該對(duì)象鎖被其他的線程持有,則該線程進(jìn)入Blocked狀態(tài)。當(dāng)該線程持有鎖時(shí),該線程將自動(dòng)變成RUNNABLE狀態(tài)。

4.WAITING(休眠)休眠態(tài):一個(gè)線程在等待另一個(gè)線程執(zhí)行一個(gè)(喚醒)動(dòng)作時(shí),該線程進(jìn)入Waiting狀態(tài)。進(jìn)入這個(gè)狀態(tài)后是不能自動(dòng)喚醒的,必須等待另一個(gè)線程調(diào)用notify或者notifyAll方法才能夠喚醒。

5.TIMED_WAITING (指定休眠時(shí)間)指定時(shí)間休眠態(tài):基本同WAITING狀態(tài),多了個(gè)超時(shí)參數(shù),調(diào)用對(duì)應(yīng)方法時(shí)線程將進(jìn)入TIMED_WAITING狀態(tài),這一狀態(tài)將一直保持到超時(shí)期滿(mǎn)或者接收到喚醒通知,帶有超時(shí)參數(shù)的常用方法有Thread.sleep、鎖對(duì)象.wait() 。

6.TERMINATED (結(jié)束)結(jié)束態(tài):從RUNNABLE狀態(tài)正常退出而死亡,或者因?yàn)闆](méi)有捕獲的異常終止了RUNNABLE狀態(tài)而死亡。

系統(tǒng)啟動(dòng)的線程有哪些

count:18
方法2:線程池的線程:Thread[Catalina-utility-1,1,main]
方法2:線程池的線程:Thread[Catalina-utility-2,1,main]
方法2:線程池的線程:Thread[container-0,5,main]
方法2:線程池的線程:Thread[File Watcher,5,main]
方法2:線程池的線程:Thread[Live Reload Server,5,main]
-----------------名字包含了http 默認(rèn)初始10個(gè)線程
-----------------Acceptor線程主要用于監(jiān)聽(tīng)套接字,將已連接套接字轉(zhuǎn)給Poller線程。
-----------------Poller線程主要用于以較少的資源輪詢(xún)已連接套接字以保持連接,當(dāng)數(shù)據(jù)可用時(shí)轉(zhuǎn)給工作線程。
方法2:線程池的線程:Thread[http-nio-0.0.0.0-8089-exec-1,5,main]
方法2:線程池的線程:Thread[http-nio-0.0.0.0-8089-exec-2,5,main]
方法2:線程池的線程:Thread[http-nio-0.0.0.0-8089-exec-3,5,main]
方法2:線程池的線程:Thread[http-nio-0.0.0.0-8089-exec-4,5,main]
方法2:線程池的線程:Thread[http-nio-0.0.0.0-8089-exec-5,5,main]
方法2:線程池的線程:Thread[http-nio-0.0.0.0-8089-exec-6,5,main]
方法2:線程池的線程:Thread[http-nio-0.0.0.0-8089-exec-7,5,main]
方法2:線程池的線程:Thread[http-nio-0.0.0.0-8089-exec-8,5,main]
方法2:線程池的線程:Thread[http-nio-0.0.0.0-8089-exec-9,5,main]
方法2:線程池的線程:Thread[http-nio-0.0.0.0-8089-exec-10,5,main]
方法2:線程池的線程:Thread[http-nio-0.0.0.0-8089-Poller,5,main]
方法2:線程池的線程:Thread[http-nio-0.0.0.0-8089-Acceptor,5,main]
--------------------
方法2:線程池的線程:Thread[DestroyJavaVM,5,main]

代碼

Thread mainThread = Thread.currentThread();
ThreadGroup mainThreadThreadGroup = mainThread.getThreadGroup();
//獲取線程組中的線程。
int count = mainThreadThreadGroup.activeCount();
System.out.println("count:"+count);
Thread[] threads = new Thread[count];
//enumerate 枚舉,recurse 遞歸
mainThreadThreadGroup.enumerate(threads, true);
Stream.of(threads).filter(Thread::isAlive).forEach(thread -> System.out.println("方法2:線程池的線程:" + thread ));

http的線程根據(jù)上面的信息

WAITING狀態(tài)的排除,名字做點(diǎn)過(guò)濾,去掉當(dāng)前線程,因?yàn)閺纳厦娴玫降木€程池不知道怎么得到線程,這里拿到所有做過(guò)濾。

Map<Thread, StackTraceElement[]> allThread = Thread.getAllStackTraces();
for (Thread t : allThread.keySet()) {
/**
 * 一個(gè)線程可以在給定時(shí)間點(diǎn)處于一個(gè)狀態(tài)。 這些狀態(tài)是不反映任何操作系統(tǒng)線程狀態(tài)的虛擬機(jī)狀態(tài)。
 *
 * 線程狀態(tài)。 線程可以處于以下?tīng)顟B(tài)之一:
 * NEW              尚未啟動(dòng)的線程處于此狀態(tài)。
 * RUNNABLE         在Java虛擬機(jī)中執(zhí)行的線程處于此狀態(tài)。
 * BLOCKED          被阻塞等待監(jiān)視器鎖定的線程處于此狀態(tài)。
 * WAITING          正在等待另一個(gè)線程執(zhí)行特定動(dòng)作的線程處于此狀態(tài)。
 * TIMED_WAITING    正在等待另一個(gè)線程執(zhí)行動(dòng)作達(dá)到指定等待時(shí)間的線程處于此狀態(tài)。
 * TERMINATED       已退出的線程處于此狀態(tài)。
 * */
    StringBuilder sb=new StringBuilder();
    if(!Thread.State.WAITING.equals(t.getState()) &&
       t.getName().indexOf("http")>-1 &&
       !Thread.currentThread().equals(t)) {
        System.out.println(t.getName()+":"+t.getState());
        sb.setLength(0);
        for (StackTraceElement ele : t.getStackTrace()) {
            sb.append(ele.getClassName()).append(".").append(ele.getMethodName()).append(".").append(ele.getFileName()).append("$").append(ele.getLineNumber()).append("\n");
        }
        System.out.println(sb.toString());
    }
}

測(cè)試

@RequestMapping(value = "/hello")
public String testHello(Model model) throws InterruptedException {
    Thread.sleep(5000);
    model.addAttribute("currentTime", new Date());
    return "hello";
}

@RequestMapping(value = "/hello2")
public String testHello2(Model model) throws InterruptedException {
    for(int i=0;i<Integer.MAX_VALUE;i++){
        for(int j=0;j<Integer.MAX_VALUE;j++){}
    }
    model.addAttribute("currentTime", new Date());
    return "hello";
}

以上就是tomcat獲取執(zhí)行的線程池信息和線程堆棧的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于tomcat線程池信息和線程堆棧的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Tomcat端口僅允許本地訪問(wèn)設(shè)置的兩種實(shí)現(xiàn)方法

    Tomcat端口僅允許本地訪問(wèn)設(shè)置的兩種實(shí)現(xiàn)方法

    要設(shè)置Tomcat端口僅允許本地訪問(wèn),可以通過(guò)兩種主要方式實(shí)現(xiàn),下面通過(guò)配置文件結(jié)合相關(guān)實(shí)例給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧
    2025-05-05
  • idea中沒(méi)有tomcat選項(xiàng)如何配置添加tomcat

    idea中沒(méi)有tomcat選項(xiàng)如何配置添加tomcat

    多的工程用IDEA打開(kāi)調(diào)試,如果用到 tomcat服務(wù),都要配置一下,本文主要介紹了idea中沒(méi)有tomcat選項(xiàng)如何配置添加tomcat,下面就來(lái)具體介紹一下,感興趣的可以了解一下
    2024-05-05
  • Tomcat默認(rèn)程序發(fā)布路徑的使用與修改方法講解

    Tomcat默認(rèn)程序發(fā)布路徑的使用與修改方法講解

    今天小編就為大家分享一篇關(guān)于Tomcat默認(rèn)程序發(fā)布路徑的使用與修改方法講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • 詳解Tomcat常用的過(guò)濾器

    詳解Tomcat常用的過(guò)濾器

    過(guò)濾器Filter是定義于tomcat的servlet-api.jar中的一個(gè)接口,接口路徑為javax.servlet.Filter。tomcat過(guò)濾器采用了典型的過(guò)濾器設(shè)計(jì)模式,過(guò)濾器鏈FilterChain由tomcat維持,鏈條是可以支持多個(gè)過(guò)濾器的
    2021-06-06
  • 關(guān)于Tomcat?結(jié)合Atomikos?實(shí)現(xiàn)JTA的方法

    關(guān)于Tomcat?結(jié)合Atomikos?實(shí)現(xiàn)JTA的方法

    Tomcat作為一款經(jīng)典的Web服務(wù)器,在開(kāi)發(fā)、測(cè)試和生產(chǎn)環(huán)境中得到了廣泛的使用。但Tomcat畢竟不是Java EE服務(wù)器,因此在EJB,JTA方面并沒(méi)有提供支持。本文講述了Tomcat使用Atomikos實(shí)現(xiàn)JTA的一種方法,需要的朋友可以參考下
    2021-11-11
  • Apache及Tomcat搭建集群環(huán)境過(guò)程解析

    Apache及Tomcat搭建集群環(huán)境過(guò)程解析

    這篇文章主要介紹了Apache及Tomcat搭建集群環(huán)境過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 詳解springboot-修改內(nèi)置tomcat版本

    詳解springboot-修改內(nèi)置tomcat版本

    這篇文章主要介紹了springboot-修改內(nèi)置tomcat版本的相關(guān)資料,希望通過(guò)本文大家能掌握這樣的方法,需要的朋友可以參考下
    2017-08-08
  • tomcat配置虛擬路徑的實(shí)現(xiàn)步驟

    tomcat配置虛擬路徑的實(shí)現(xiàn)步驟

    本文主要介紹了tomcat配置虛擬路徑的實(shí)現(xiàn)步驟,主要是在localhost文件中進(jìn)行配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Maven 修改tomcat運(yùn)行版本和端口的實(shí)現(xiàn)方法

    Maven 修改tomcat運(yùn)行版本和端口的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇Maven 修改tomcat運(yùn)行版本和端口的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 修改TOMCAT的JVM虛擬機(jī)內(nèi)存大小的三種方法

    修改TOMCAT的JVM虛擬機(jī)內(nèi)存大小的三種方法

    Tomcat默認(rèn)可以使用的內(nèi)存為128MB,在較大型的應(yīng)用項(xiàng)目中,這點(diǎn)內(nèi)存是不夠的,需要調(diào)大,經(jīng)常會(huì)出現(xiàn)Java.lang.OutOfMemoryError: Java heap space 即JVM Heap溢出的錯(cuò)誤,所以本文介紹了修改TOMCAT的JVM虛擬機(jī)內(nèi)存大小的三種方法,需要的朋友可以參考下
    2024-09-09

最新評(píng)論

舒城县| 黑龙江省| 基隆市| 上蔡县| 乐东| 鲁山县| 大兴区| 潼南县| 开封县| 杂多县| 鹰潭市| 乌鲁木齐市| 噶尔县| 衢州市| 梁平县| 乐都县| 全椒县| 安宁市| 邢台市| 永丰县| 双流县| 华池县| 正镶白旗| 隆化县| 德阳市| 阿克陶县| 龙口市| 梅州市| 贺兰县| 乌恰县| 土默特左旗| 邵东县| 大关县| 石柱| 香港| 含山县| 大丰市| 鞍山市| 印江| 江油市| 武冈市|