【并发编程】Thread类的详细介绍
本博客系列是学习并发编程过程中的记录总结。由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅。
Thread
类是Java中实现多线程编程的基础类。本篇博客就来介绍下Thread
类的常用API和常见用法。
Thread
类常用的方法如下:
- Thread.activeCount():这个方法用于返回当前线程的线程组中活动线程的数量,返回的值只是一个估计值,因为当此方法遍历内部数据结构时,线程数可能会动态更改。)。
- Thread.checkAccess(): 检验当前正在执行的线程是否有权限修改thread的属性,这个方法我们一般不自己进行调用,Thread类的set方法在进行属性修改时都会先调用这个方法。
- Thread.currentThread():获取当前正在运行的线程。
- Thread.dumpStack():输出线程栈,一般在debug的时候调用。
- Thread.enumerate(Thread tarray[]):??使用场景。
- Thread.getAllStackTraces():获取系统中所有线程的线程栈信息。
- thread.getName():获取线程的名字。
- thread.getPriority():获取线程的优先级。
- thread.getStackTrace():获取堆栈信息。
- thread.getState():获取线程状态。
- thread.getThreadGroup():获取线程所在线程组。
- thread.interrupt():使得指定线程中断阻塞状态,并将阻塞标志位置为true。
- thread.interrupted():测试当前线程是否被中断。
- thread.isAlive():判断线程是否还存活着。
- thread.isDaemon():判断线程是否是守护线程。
- thread.join():在当前线程中加入指定线程,使得当前线程必须等待指定线程运行结束之后,才能结束。可以理解成线程插队、等待该线程终止。
- Thread.sleep(long):强制线程睡眠一段时间。
- thread.start():启动一个线程。
- thread.setName(name):设置线程的名字。
- thread.setPriority(priority):设置线程的优先级。
- thread.setDaemon(true):将指定线程设置为守护线程。
- thread.yield():使得当前线程退让出CPU资源,把CPU调度机会分配给同样线程优先级的线程。
- object.wait()、object.notify()、object.notifyAll():Object类提供的线程等待和线程唤醒方法。
示例代码#
public class MyThread { public static void main(String[] args) { Thread thread = Thread.currentThread(); //这个方法返回的是当前线程所在线程组以及这个线程组的子线程组内活动的线程数 //这个值是一个估计值,所以这个方法的应用场景不大 int activeCount = Thread.activeCount(); System.out.println("当前系统中活动线程数["+activeCount+"]"); //向标准错误输出流输出当前的线程栈,不会阻断程序的继续执行 Thread.dumpStack(); //获取所有线程栈信息 Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces(); //获取类加载器 ClassLoader contextClassLoader = thread.getContextClassLoader(); //获取当前线程名字 String threadName = thread.getName(); System.out.println("current thread name["+threadName+"]"); //获取当前线程ID long threadId = thread.getId(); System.out.println("current thread id["+threadId+"]"); //获取当前线程的优先级,一共有1~10总共10个优先级,这个优先级并不是在 //所有平台都生效的 int priority = thread.getPriority(); System.out.println("current thread priority["+priority+"]"); StackTraceElement[] stackTrace = thread.getStackTrace(); System.out.println("-------------stackTrace info--------------"); for (int i = 0; i < stackTrace.length; i++) { StackTraceElement element = stackTrace[i]; System.out.println("className:["+element.getClassName()+"]"); System.out.println("fileName:["+element.getFileName()+"]"); System.out.println("line nunber:["+element.getLineNumber()+"]"); System.out.println("method name:["+element.getMethodName()+"]"); System.out.println("is native method:["+element.isNativeMethod()+"]"); System.out.println("------------------------------------------"); } Thread.State state = thread.getState(); System.out.println("thread state:["+state+"]"); ThreadGroup threadGroup = thread.getThreadGroup(); String threadGroupName = threadGroup.getName(); System.out.println("thread group name:["+threadGroupName+"]"); //线程睡眠,调用sleep方法会使得线程进入timed_waiting状态,如果线程已经 //获得了锁资源,调用sleep方法是不会释放这个锁的 Thread.sleep(2000,500); Thread.