/* * This file is part of spark. * * Copyright (C) Albert Pham * Copyright (c) lucko (Luck) * Copyright (c) contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package me.lucko.spark.sampler; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; import java.util.Set; import java.util.stream.Collectors; /** * Uses the {@link ThreadMXBean} to generate {@link ThreadInfo} instances for the threads being * sampled. */ @FunctionalInterface public interface ThreadDumper { /** * Generates {@link ThreadInfo} data for the sampled threads. * * @param threadBean the thread bean instance to obtain the data from * @return an array of generated thread info instances */ ThreadInfo[] dumpThreads(ThreadMXBean threadBean); /** * Implementation of {@link ThreadDumper} that generates data for all threads. */ ThreadDumper ALL = new All(); final class All implements ThreadDumper { @Override public ThreadInfo[] dumpThreads(ThreadMXBean threadBean) { return threadBean.dumpAllThreads(false, false); } } /** * Implementation of {@link ThreadDumper} that generates data for a specific set of threads. */ final class Specific implements ThreadDumper { private final long[] ids; public Specific(long[] ids) { this.ids = ids; } public Specific(Set names) { Set threadNamesLower = names.stream().map(String::toLowerCase).collect(Collectors.toSet()); this.ids = Thread.getAllStackTraces().keySet().stream() .filter(t -> threadNamesLower.contains(t.getName().toLowerCase())) .mapToLong(Thread::getId) .toArray(); } @Override public ThreadInfo[] dumpThreads(ThreadMXBean threadBean) { return threadBean.getThreadInfo(this.ids, Integer.MAX_VALUE); } } }