美文网首页
查看java线程数量及线程名并进行校验

查看java线程数量及线程名并进行校验

作者: adonisjph | 来源:发表于2017-04-19 17:04 被阅读205次

需求

  • 一个后台Java程序启动时,可以在配置文件中配置线程数量。需要获取线程数量和线程名进行校验。

思路

  1. 读取配置文件,获得配置的线程数量。
  2. 获取该java程序的进程pid
  3. 通过jstack 获取该进程的线程详情并重定向至文件
  4. python 读取该文件并进行分析

实现

该java程序会将pid写入一个文件中,所以直接读取该文件获得pid即可。此处将上述的2、3使用shell脚本实现。

#! /bin/bash
pid=`cat tpid`
jstack $pid >> ./$pid.txt

python 读取该文件并进行分析

# -*- coding: utf-8 -*-
import re
import json
import subprocess
import sys
reload(sys)
sys.setdefaultencoding('utf8')

def get_real_threads_name_list(jstack_file):         #从jstack log中获取实际的线程数及线程名
    log_file = open(jstack_file, 'r')
    pattern = re.compile('"(.*)"')
    real_threads_name_list = pattern.findall(log_file.read())
    log_file.close()
    print json.dumps(real_threads_name_list, encoding='utf-8', ensure_ascii=False)
    return real_threads_name_list

def is_chinese(param_list):       #判断是否中文
    real_threads_num = 0
    for i in param_list:
        if u'\u4e00' <= i <= u'\u9fff':
            real_threads_num += 1
    return real_threads_num


def get_application_threads_num(file_path):      #从配置文件读取配置的线程数量
    application_yaml = open(file_path)
    application_threads_num = 0
    application = yaml.load(application_yaml)
    if application['frms.etl.pay']['enable']:
        application_threads_num += application['frms.etl.pay']['threadSize']
    if application['frms.pay.auditobj']['enable']:
        application_threads_num += application['frms.pay.auditobj']['threadsize']
    if application['frms.pay.ds']['enable']:
        application_threads_num += application['frms.pay.ds']['threadsize']
    if application['frms.pay']['streamcube.publish.enable']:
        application_threads_num += application['frms.pay']['dsobj']['threadsize']
    if application['frms']['pay.etl']['cloud.call']:
        application_threads_num += application['frms']['etl.data.service']['threadSize']
    application_threads_num += application['frms.etl.scheduled.threadSize']
    application_yaml.close()
    return application_threads_num


def compare(a, b):     #比较
    if a == b:
        print 'ok'
    else:
        print 'not ok'


if __name__ == '__main__':
    subprocess.call('pid_log.sh', shell=True)         #调用shell脚本
    real_threads_nums = is_chinese(get_real_threads_name_list('H:\\scripts\\jstack19666.txt'))
    application_threads_nums = get_application_threads_num(
        'application(1).yml')
    compare(real_threads_nums, application_threads_nums)

新需求
通过jstack远程连接服务器
还没实现

相关文章

  • 查看java线程数量及线程名并进行校验

    需求 一个后台Java程序启动时,可以在配置文件中配置线程数量。需要获取线程数量和线程名进行校验。 思路 读取配置...

  • tomcat组件及原理详细分析

    查看端口号连接数 查看java进程id 查看进程下有多少线程 获取真正在running的线程数量 tomcat组件...

  • jvm相关信息查看

    1 查看某进程的线程数量 top之后,界面类似如下,Threads: 309 total,即是线程数 2 java...

  • java常用命令

    jps 显示当前系统的java进程情况及id号。 jstack 用于生成JVM当前时刻的线程快照,查看JAVA线程...

  • Java进程cpu飙升检查

    操作步骤 top -H -p pid 查看进程下的线程负载,并拿到cpu占比高的线程ID java -cp .:/...

  • 多线程 | 4.线程池

    Java并发编程:线程池的使用 线程池基础 请求队列 线程池维护一定数量的线程,当线程池在运行状态的线程数量达上...

  • 线程池的原理

    线程数量和队列的关系流程的示意图线程池的优势小刘老实讲源码 线程池的优势 线程池是 Java 中对线程进行统一管理...

  • Java实例-线程

    1、Java 实例 – 查看线程是否存活:通过继承 Thread 类并使用 isAlive() 方法来检测一个线程...

  • 面试题2019年7月

    线程池原理 参考:Java 线程池原理分析 线程池工作原理:1、线程数量小于 corePoolSize,直接创建新...

  • Linux系统相关参数查看

    查看物理CPU个数 查看核心数量 查看线程数 查看一个进程的线程数 ps命令参数组合查看

网友评论

      本文标题:查看java线程数量及线程名并进行校验

      本文链接:https://www.haomeiwen.com/subject/eqrhzttx.html