Thread类方法提供一些功能。
1 currentThread
返回当前正在执行的线程对象的引用。
Thread thread = Thread.currentThread();
System.out.println(thread);
打印调用的Thread的toString方法。
打印线程名、优先级、组名信息。
Thread[main,5,main]
2 activeCount
返回当前线程的及其子组中活动线程数的估计。递归迭代当前线程的线程组中的所有子组。返回的值只是一个估计值,因为当此方法遍历内部数据结构时,线程的数量可能会动态变化,并且可能受到某些系统线程的存在的影响。此方法主要用于调试和监视目的。
int activeCount = Thread.activeCount();
System.out.println(activeCount);
3 dumpStack
将当前线程的堆栈跟踪输出到标准错误流。此方法仅用于调试。
Thread.dumpStack();
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1336)
at org.example.ThreadUtil.main(ThreadUtil.java:18)
4 enumerate
将当前线程的线程组及其子组中的每个活动线程复制到指定数组中。应用程序可以使用Thread.activeCount方法来估计数组应该有多大,用于调试和监视目的。
Thread[] threads = new Thread[Thread.activeCount()];
int enumerate = Thread.enumerate(threads);
System.out.println(enumerate);
System.out.println(Arrays.toString(threads));
5 getAllStackTraces
返回所有活动线程的栈信息。接近jstack
Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces();
allStackTraces.forEach((k, v) ->{
System.out.println("===========start==========");
System.out.println(k);
Arrays.stream(v).forEach(System.out::println);
System.out.println("===========end==========\n");
});
6 getDefaultUncaughtExceptionHandler
返回当线程因未捕获异常而突然终止时调用的默认处理程序,默认为null(控制台打印异常栈)。可以通过setDefaultUncaughtExceptionHandler设置
Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
System.out.println(defaultUncaughtExceptionHandler);
7 setDefaultUncaughtExceptionHandler
设置当线程因未捕获异常而突然终止且未为该线程定义其他处理程序时调用的默认处理程序。未捕获异常处理首先由线程控制,然后由线程组对象控制,最后由默认的未捕获异常处理程序控制。可以用于异常统一收集分析。
@FunctionalInterface
public interface UncaughtExceptionHandler {
void uncaughtException(Thread t, Throwable e);
}
Thread.setDefaultUncaughtExceptionHandler((new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println(t);
System.out.println(e);
}
}));
8 holdsLock
当且仅当当前线程持有指定对象上的监视器锁时返回true
Object lock = new Object();
Object lock2 = new Object();
// holdsLock
synchronized (lock) {
System.out.println(Thread.holdsLock(lock));
System.out.println(Thread.holdsLock(lock2));
}
9 interrupted
测试当前线程是否已中断。线程的中断状态通过此方法清除
10 sleep
根据系统计时器和调度器的精度和准确性,使当前正在执行的线程休眠(临时停止执行)指定的毫秒数[加上指定的纳秒数]。线程不会失去任何监视器的所有权。如果有线程中断了当前线程。当抛出InterruptedException,当前线程的interrupted status将被清除。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
11 yield
向调度程序提示当前线程愿意让出其当前对处理器的使用。调度程序可以忽略这个提示。Yield是一种启发式的尝试,它可以改善那些过度使用CPU的线程之间的相对进程。它的使用应该与详细的概要分析和基准测试相结合,以确保它实际上具有预期的效果。
12 MAX_PRIORITY
线程可以拥有的最大优先级。10
13 MIN_PRIORITY
线程可以拥有的最小优先级。1
14 NORM_PRIORITY
分配给线程的默认优先级。5