From dc59f456004313bc4bfe2cd8e490111bb744ff3b Mon Sep 17 00:00:00 2001 From: huoyo <1729913829@qq.com> Date: Fri, 17 Mar 2023 23:23:30 +0800 Subject: [PATCH] add thread statistics (base) --- .../kotime/controller/KoTimeController.java | 10 +++ .../cn/langpy/kotime/model/ThreadInfo.java | 78 +++++++++++++++++++ .../kotime/service/ThreadUsageService.java | 40 ++++++++++ 3 files changed, 128 insertions(+) create mode 100644 src/main/java/cn/langpy/kotime/model/ThreadInfo.java create mode 100644 src/main/java/cn/langpy/kotime/service/ThreadUsageService.java diff --git a/src/main/java/cn/langpy/kotime/controller/KoTimeController.java b/src/main/java/cn/langpy/kotime/controller/KoTimeController.java index 40918e1..78f1a1e 100644 --- a/src/main/java/cn/langpy/kotime/controller/KoTimeController.java +++ b/src/main/java/cn/langpy/kotime/controller/KoTimeController.java @@ -7,6 +7,7 @@ import cn.langpy.kotime.model.*; import cn.langpy.kotime.service.ClassService; import cn.langpy.kotime.service.GraphService; import cn.langpy.kotime.service.SysUsageService; +import cn.langpy.kotime.service.ThreadUsageService; import cn.langpy.kotime.util.Context; import cn.langpy.kotime.util.InvalidAuthInfoException; import cn.langpy.kotime.util.KoUtil; @@ -358,4 +359,13 @@ public class KoTimeController { graphService.clearAll(); return true; } + + @GetMapping("/getThreadsInfo") + @ResponseBody + @Auth + public List getThreadsInfo() { + ThreadUsageService usageService = ThreadUsageService.newInstance(); + List threads = usageService.getThreads(); + return threads; + } } diff --git a/src/main/java/cn/langpy/kotime/model/ThreadInfo.java b/src/main/java/cn/langpy/kotime/model/ThreadInfo.java new file mode 100644 index 0000000..2ce9845 --- /dev/null +++ b/src/main/java/cn/langpy/kotime/model/ThreadInfo.java @@ -0,0 +1,78 @@ +package cn.langpy.kotime.model; + +import java.util.List; + +public class ThreadInfo { + private Long id; + private String name; + private String classType; + private String state; + private Boolean isInterrupted; + private Boolean isDaemon; + private Integer priority; + private List stacks; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Boolean getInterrupted() { + return isInterrupted; + } + + public void setInterrupted(Boolean interrupted) { + isInterrupted = interrupted; + } + + public String getClassType() { + return classType; + } + + public void setClassType(String classType) { + this.classType = classType; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public Boolean getDaemon() { + return isDaemon; + } + + public void setDaemon(Boolean daemon) { + isDaemon = daemon; + } + + public Integer getPriority() { + return priority; + } + + public void setPriority(Integer priority) { + this.priority = priority; + } + + public List getStacks() { + return stacks; + } + + public void setStacks(List stacks) { + this.stacks = stacks; + } +} diff --git a/src/main/java/cn/langpy/kotime/service/ThreadUsageService.java b/src/main/java/cn/langpy/kotime/service/ThreadUsageService.java new file mode 100644 index 0000000..df3e3bb --- /dev/null +++ b/src/main/java/cn/langpy/kotime/service/ThreadUsageService.java @@ -0,0 +1,40 @@ +package cn.langpy.kotime.service; + +import cn.langpy.kotime.model.ThreadInfo; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.logging.Logger; +import java.util.stream.Collectors; + +public class ThreadUsageService { + private static Logger log = Logger.getLogger(ThreadUsageService.class.toString()); + + public static ThreadUsageService newInstance() { + return new ThreadUsageService(); + } + + public List getThreads() { + ThreadGroup threadGroup = Thread.currentThread().getThreadGroup(); + int activeCount = threadGroup.activeCount(); + Thread[] threads = new Thread[activeCount]; + threadGroup.enumerate(threads); + List list = new ArrayList<>(); + for (int i = 0; i < activeCount; i++) { + Thread thread = threads[i]; + ThreadInfo threadInfo = new ThreadInfo(); + threadInfo.setId(thread.getId()); + threadInfo.setName(thread.getName()); + threadInfo.setClassType(thread.getClass().getSimpleName()); + threadInfo.setState(thread.getState().name()); + threadInfo.setInterrupted(thread.isInterrupted()); + threadInfo.setDaemon(thread.isDaemon()); + threadInfo.setPriority(thread.getPriority()); + StackTraceElement[] stackTrace = thread.getStackTrace(); + threadInfo.setStacks(Arrays.stream(stackTrace).collect(Collectors.toList())); + list.add(threadInfo); + } + return list; + } +}