aboutsummaryrefslogtreecommitdiff
path: root/common/src/main/java/me/lucko/spark/profiler/ThreadGrouper.java
diff options
context:
space:
mode:
Diffstat (limited to 'common/src/main/java/me/lucko/spark/profiler/ThreadGrouper.java')
-rw-r--r--common/src/main/java/me/lucko/spark/profiler/ThreadGrouper.java52
1 files changed, 52 insertions, 0 deletions
diff --git a/common/src/main/java/me/lucko/spark/profiler/ThreadGrouper.java b/common/src/main/java/me/lucko/spark/profiler/ThreadGrouper.java
new file mode 100644
index 0000000..56a6cc4
--- /dev/null
+++ b/common/src/main/java/me/lucko/spark/profiler/ThreadGrouper.java
@@ -0,0 +1,52 @@
+package me.lucko.spark.profiler;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Function for grouping threads together
+ */
+@FunctionalInterface
+public interface ThreadGrouper {
+
+ /**
+ * Gets the group for the given thread.
+ *
+ * @param threadName the name of the thread
+ * @return the group
+ */
+ String getGroup(String threadName);
+
+ /**
+ * Implementation of {@link ThreadGrouper} that just groups by thread name.
+ */
+ ThreadGrouper BY_NAME = new ByName();
+
+ final class ByName implements ThreadGrouper {
+ @Override
+ public String getGroup(String threadName) {
+ return threadName;
+ }
+ }
+
+ /**
+ * Implementation of {@link ThreadGrouper} that attempts to group by the name of the pool
+ * the thread originated from.
+ */
+ ThreadGrouper BY_POOL = new ByPool();
+
+ final class ByPool implements ThreadGrouper {
+ private static final Pattern THREAD_POOL_PATTERN = Pattern.compile("^(.*)[-#] ?\\d+$");
+
+ @Override
+ public String getGroup(String threadName) {
+ Matcher matcher = THREAD_POOL_PATTERN.matcher(threadName);
+ if (!matcher.matches()) {
+ return threadName;
+ }
+
+ return matcher.group(1).trim() + " (Combined)";
+ }
+ }
+
+}