【并发编程】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+"]");//获取当前线程IDlong 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.sleep(1000);TimeUnit.SECONDS.sleep(2);Thread thread1 = new Thread(new Runnable() {@SneakyThrows@Overridepublic void run() {TimeUnit.SECONDS.sleep(100);}});thread1.start();thread1.join(50);}}
守护线程
守护线程可以理解为服务线程,他们的作用就是服务于其他用户线程。当系统中不存在其他用户线程时,这些守护线程也会自动消亡。比如JVM的垃圾清理线程就是守护线程。我们可以使用如下方法查看和设置线程是否是守护线程。
thread.isDaemon();
thread.setDaemon(true);
join方法
调用线程的join方法会使得调用线程进入waiting状态,直到被调用的线程执行结束,调用线程才会重新获得执行的机会。
public class MyThread {public static void main(String[] args) throws Exception {Thread thread1 = new Thread(new Runnable() {@SneakyThrows@Overridepublic void run() {TimeUnit.SECONDS.sleep(100);}});thread1.start();thread1.join();System.out.println("main thread end...");}}
上面的代码中,main线程调用了thread1的join方法,main线程会被挂起进入waiting状态,直到thread1执行完毕之后,main线程才有机会重新获得执行机会。
join方法还有一个重载方法,这个方法可以指定超时时间。
thread1.join(50);
如果thread1线程在50ms内还没执行完,main线程就可以重新获得执行机会。
yeild方法
调用线程的yield方法不是一定会成功。
- 退让成功时,退让线程会由Running(运行)转为Runnable(就绪)状态。
- 退让了的线程,与其他同优先级级别的线程一样,同样有再次获取CPU使用权的机会。
中断
先贴上一段网友对线程中断的总结。
- 除非是线程自己interrupt()自己,否则checkAccess()方法都会被调用,并可能抛出一个SecurityException异常。
如果当前线程处于blocked阻塞(因为调用wait、sleep和join造成的)状态时被interrupt了,那么[中断标志位]将被清除,并且收到一个InterruptedException异常。 - 如果当前线程处于blocked阻塞(因为NIO的InterruptibleChannel进行的I/O操作造成的)状态时被interrupt了,则会关闭channel,[中断标志位]将会被置为true,并且当前线程会收到一个ClosedByInterruptException异常。
- 如果当前线程处于blocked阻塞(因为NIO的Selector造成的)状态时被interrupt了,那么[中断标志位]将被置为true,然后当前线程会立即从选择器区域返回并返回值(可能为非零的值)。
- 如果前面的情况都没有发生,则线程会将[中断标志位]将被置为true。
更加易懂的说法(不包括NIO部分):
- interrupt()方法并不是中断线程,而是中断阻塞状态,或者将线程的[中断标志位]置为true。
- 对于未阻塞的线程,interrupt()只是造成[中断标志位]=rue,线程本身运行状态不受影响。
- 对于阻塞的线程,interrupt()会中断阻塞状态,使其转换成非阻塞状态,并清除[中断标志位]。
- 造成阻塞状态的情况有:sleep()、wait()和join()。
- 阻塞状态的线程被中断时,只是中断了阻塞状态,即sleep()、wait()和join(),线程本身还在继续运行。
【并发编程】Thread类的详细介绍相关推荐
- Thread类的详细介绍
Thread类简介 Thread类是Java中实现多线程编程的基础类.本篇博客就来介绍下Thread类的常用API和常见用法. Thread类常用的方法如下: Thread.activeCount() ...
- Java并发编程—Thread类的start()方法是如何启动一个线程的?
目录 一:Java线程介绍 二:Java线程入口分析 三:Java线程的创建 四:总结 周末抽了点时间,研究了下HotSpot是如何创建Java线程的,顺便总结一下.文中引用的源码里删除很多细节,只保 ...
- windows下编程控制摄像头的详细介绍
这段时间闲来无事,看了看MSDN的文档,自己翻译了一下.一是为了学习,二是对空闲时间的打发.所以也希望大家在拍砖的同时,尊重我的劳动,如要转贴请注明转至blog.csdn.net/suntaoznz. ...
- 路由 OSPF LSA介绍、1~7类LSA详细介绍
1.0.0 路由 OSPF LSA介绍.1~7类LSA详细介绍 OSPF LSA 链路状态通告( Link status announcement),作用于 向其它邻接OSPF路由器 传递拓扑信息与路 ...
- Win32 OpenGL编程 5 顶点数组详细介绍
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Win3 ...
- Java Scanner类的详细介绍(Java键盘输入)
Java Scanner类的详细介绍(Java键盘输入) 一.Scanner类的简单使用 二.Scanner类的详细介绍 1.判断输入数据类型 2.next()与nextLine()的区别 3.求多个 ...
- java并发编程之线程的基本介绍
线程的基本介绍: 定义:线程是操作系统能够能够进行运算调度的最小单位,它被包含在进程当中,是进程的实际运作单位. 并发和并行的介绍: 并发:在一个时间段内能运行多个线程,通过系统的调度交替执行. 并行 ...
- java并发编程工具类辅助类:CountDownLatch、CyclicBarrier和 Semaphore
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 以下 ...
- Java并发编程工具类:CountDownLatch、CyclicBarrier、Semaphore
在jdk5中,java提供了一些非常有用的辅助工具类,包括CountDownLatch和CyclicBarrier(两者都可以实现线程之间的通信).Semaphore(控制方法被线程访问的数量),他们 ...
最新文章
- Pytorch的神经网络编程学习第一节
- 关于Firefox在Win8下界面显示错乱的解决方法
- Zookeeper系列(十)zookeeper的服务端启动详述
- mysql insert into 变量+1_如何在MySQL INSERT语句中包含PHP变量
- 四大主流BI工具比较
- 使用Visual Studio Code 运行编写第一个html文件
- 02_Android写xml文件和读xml文件
- SAP成都研究院CEC团队三巨头之一:M君的文章预告
- 博客园程序源代码下载
- IoT实时数据可视化方案(进阶版):Worldmap Panel使用详解及使用Node-RED进行流程管理...
- Retrofit结合RxJava使用指南
- IPVSADM+PIRANHA+KEEPALIVED集群
- 中国注塑机市场十四五规划建议与竞争态势研究报告2022版
- 【转载】排列组合公式原理
- 【BLE】CC2640芯片简介
- linux中cpu_to_be32,Linux cpufreq framework(2)
- TCP三次握手四次挥手
- 男神体 骚包体 快乐体 手拙体 好身体(haha),你知道这些字体的英文名字吗?
- CPI公式 CPI含义 CPI意义 CPI什么意思
- windows中的一些小技巧