tomcat获取执行的线程池信息和线程堆栈的方法详解

 更新时间:2023年11月29日 08:21:20   作者:冒泡的肥皂  
这篇文章主要给大家介绍了tomcat获取执行的线程池信息和线程堆栈的方法,文章通过代码示例介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

最近打算还是了解点java吧,搞点小demo。

想了解的知识点:

  • 数据请求的堆栈,因为遇到过数据库锁表需要定位。(今天做点记录,但有点不完美)
  • 想得到数据库连接没释放的那个线程堆栈。
  • 找个access访问记录的排序工具类。

线程池信息获取

  • 线程池信息获取或者告警可以用 dynamic-tp
  • 获取tomcat的线程信息可以用下面的代码
//获取webServer线程池
ThreadPoolExecutor executor = (ThreadPoolExecutor) ((TomcatWebServer) applicationContext.getWebServer())
        .getTomcat()
        .getConnector()
        .getProtocolHandler()
        .getExecutor();
Map<String, String> returnMap = new LinkedHashMap<String, String>();
returnMap.put("核心线程数", String.valueOf(executor.getCorePoolSize()));
returnMap.put("最大线程数", String.valueOf(executor.getMaximumPoolSize()));
returnMap.put("活跃线程数", String.valueOf(executor.getActiveCount()));
returnMap.put("池中当前线程数", String.valueOf(executor.getPoolSize()));
returnMap.put("历史最大线程数", String.valueOf(executor.getLargestPoolSize()));
returnMap.put("线程允许空闲时间/s", String.valueOf(executor.getKeepAliveTime(TimeUnit.SECONDS)));
returnMap.put("核心线程数是否允许被回收", String.valueOf(executor.allowsCoreThreadTimeOut()));
returnMap.put("提交任务总数", String.valueOf(executor.getSubmittedCount()));
returnMap.put("历史执行任务的总数(近似值)", String.valueOf(executor.getTaskCount()));
returnMap.put("历史完成任务的总数(近似值)", String.valueOf(executor.getCompletedTaskCount()));
returnMap.put("工作队列任务数量", String.valueOf(executor.getQueue().size()));
returnMap.put("拒绝策略", executor.getRejectedExecutionHandler().getClass().getSimpleName());
System.out.println(returnMap);

获取tomcat的线程堆栈信息

首先需要了解下线程的状态:

1.NEW(创建)创建态:当一个已经被创建的线程处于未被启动时,即:还没有调用start方法时,就处于这个状态。

2.RUNNABLE(运行时)运行态:当线程已被占用,在Java虚拟机中正常执行时,就处于此状态。

3.BLOCKED(排队时)阻塞态:当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态。当该线程持有锁时,该线程将自动变成RUNNABLE状态。

4.WAITING(休眠)休眠态:一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。

5.TIMED_WAITING (指定休眠时间)指定时间休眠态:基本同WAITING状态,多了个超时参数,调用对应方法时线程将进入TIMED_WAITING状态,这一状态将一直保持到超时期满或者接收到唤醒通知,带有超时参数的常用方法有Thread.sleep、锁对象.wait() 。

6.TERMINATED (结束)结束态:从RUNNABLE状态正常退出而死亡,或者因为没有捕获的异常终止了RUNNABLE状态而死亡。

系统启动的线程有哪些

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 默认初始10个线程
-----------------Acceptor线程主要用于监听套接字,将已连接套接字转给Poller线程。
-----------------Poller线程主要用于以较少的资源轮询已连接套接字以保持连接,当数据可用时转给工作线程。
方法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的线程根据上面的信息

WAITING状态的排除,名字做点过滤,去掉当前线程,因为从上面得到的线程池不知道怎么得到线程,这里拿到所有做过滤。

Map<Thread, StackTraceElement[]> allThread = Thread.getAllStackTraces();
for (Thread t : allThread.keySet()) {
/**
 * 一个线程可以在给定时间点处于一个状态。 这些状态是不反映任何操作系统线程状态的虚拟机状态。
 *
 * 线程状态。 线程可以处于以下状态之一:
 * NEW              尚未启动的线程处于此状态。
 * RUNNABLE         在Java虚拟机中执行的线程处于此状态。
 * BLOCKED          被阻塞等待监视器锁定的线程处于此状态。
 * WAITING          正在等待另一个线程执行特定动作的线程处于此状态。
 * TIMED_WAITING    正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
 * TERMINATED       已退出的线程处于此状态。
 * */
    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());
    }
}

测试

@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获取执行的线程池信息和线程堆栈的方法详解的详细内容,更多关于tomcat线程池信息和线程堆栈的资料请关注脚本之家其它相关文章!

相关文章

  • Tomcat端口仅允许本地访问设置的两种实现方法

    Tomcat端口仅允许本地访问设置的两种实现方法

    要设置Tomcat端口仅允许本地访问,可以通过两种主要方式实现,下面通过配置文件结合相关实例给大家详细讲解,感兴趣的朋友跟随小编一起看看吧
    2025-05-05
  • idea中没有tomcat选项如何配置添加tomcat

    idea中没有tomcat选项如何配置添加tomcat

    多的工程用IDEA打开调试,如果用到 tomcat服务,都要配置一下,本文主要介绍了idea中没有tomcat选项如何配置添加tomcat,下面就来具体介绍一下,感兴趣的可以了解一下
    2024-05-05
  • Tomcat默认程序发布路径的使用与修改方法讲解

    Tomcat默认程序发布路径的使用与修改方法讲解

    今天小编就为大家分享一篇关于Tomcat默认程序发布路径的使用与修改方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 详解Tomcat常用的过滤器

    详解Tomcat常用的过滤器

    过滤器Filter是定义于tomcat的servlet-api.jar中的一个接口,接口路径为javax.servlet.Filter。tomcat过滤器采用了典型的过滤器设计模式,过滤器链FilterChain由tomcat维持,链条是可以支持多个过滤器的
    2021-06-06
  • 关于Tomcat 结合Atomikos 实现JTA的方法

    关于Tomcat 结合Atomikos 实现JTA的方法

    Tomcat作为一款经典的Web服务器,在开发、测试和生产环境中得到了广泛的使用。但Tomcat毕竟不是Java EE服务器,因此在EJB,JTA方面并没有提供支持。本文讲述了Tomcat使用Atomikos实现JTA的一种方法,需要的朋友可以参考下
    2021-11-11
  • Apache及Tomcat搭建集群环境过程解析

    Apache及Tomcat搭建集群环境过程解析

    这篇文章主要介绍了Apache及Tomcat搭建集群环境过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 详解springboot-修改内置tomcat版本

    详解springboot-修改内置tomcat版本

    这篇文章主要介绍了springboot-修改内置tomcat版本的相关资料,希望通过本文大家能掌握这样的方法,需要的朋友可以参考下
    2017-08-08
  • tomcat配置虚拟路径的实现步骤

    tomcat配置虚拟路径的实现步骤

    本文主要介绍了tomcat配置虚拟路径的实现步骤,主要是在localhost文件中进行配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Maven 修改tomcat运行版本和端口的实现方法

    Maven 修改tomcat运行版本和端口的实现方法

    今天小编就为大家分享一篇Maven 修改tomcat运行版本和端口的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 修改TOMCAT的JVM虚拟机内存大小的三种方法

    修改TOMCAT的JVM虚拟机内存大小的三种方法

    Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大,经常会出现Java.lang.OutOfMemoryError: Java heap space 即JVM Heap溢出的错误,所以本文介绍了修改TOMCAT的JVM虚拟机内存大小的三种方法,需要的朋友可以参考下
    2024-09-09

最新评论