【JavaEE】多线程之Thread类 女爷i 2023-09-27 13:22 77阅读 0赞 ## 一、Thread类常见方法与字段 ## ### 1、构造方法 ### <table style="width:500px;"> <tbody> <tr> <td>构造方法</td> <td>说明</td> </tr> <tr> <td>Thread()</td> <td>不带参数的构造方法</td> </tr> <tr> <td>Thread(String name)</td> <td>可以在构造时传入线程的名字</td> </tr> <tr> <td>Thread(Runnable run)</td> <td>传入Runnable,是创建线程的方法之一</td> </tr> <tr> <td>Thread(Runnable run,String name)</td> <td>传入线程工作并给线程起名</td> </tr> </tbody> </table> ### 2、常见属性 ### #### 1.ID #### 获取方法getID,给Thread对象安排的ID,与操作系统内核里的PCB里的pid不同,不同环境里的ID作用不同 #### 2.name #### 获取方法getName,即线程的名字 #### 3.state #### 获取方法getState,用于描述线程的状态 #### 4.priority #### 获取方法getPriority,描述线程的优先级 #### 5.daemon #### 获取方法getDaemon,用于判断线程是否是守护线程(是否是后台线程),我们默认创建的线程是一个前台线程,main线程就是一个前台线程,前台线程会阻塞进程的退出,而后台进程不会阻止进程退出,一个进程里只要有一个前台线程,进程就不会挂掉 #### 6.alive #### 获取方法isAlive,Thread对象与内核里创建的线程一一对应,但是生命周期不同,当内核里的线程执行完了也就是run方法执行完了,此时内核里的线程就销毁了,但是Thread对象还在,这个方法用于判断内核里的线程是否存在 #### 7.interrupt #### 获取方法isInterrupt,主要用于判断线程是否中断 ### 3、线程的启动-start ### 当一个线程调用start方法才是真正的在内核里创建PCB,Thread实例调用start方法是创建线程,这个方法被native修饰,底层是C++实现的,而调用run方法则是在主线程单纯调用了run方法,并没有创建线程 ### 4、线程的中断 ### 线程中断的本质是让线程尽快的执行完,并不是强制将线程结束,线程中断的方法主要有设置停止的标志位,这个标志位可以自己设置,也可以使用Thread自带的标志位 设置标志位 ![97a323d0109c4178a71553034c0fc61e.png][] 使用Thread自带的标志位 ![34befb725a6143699e1586f48b152f8e.png][] 此时要主要如果线程处于运行状态,设置标志位后会正常中断 如果线程处于阻塞状态,此时设置标志位会触发异常,sleep等会被提前唤醒,线程只是打印日志并不是中断,此时只需在catch里加入break即可 ### 5、线程的等待 ### 可以通过join方法控制线程执行的先后顺序 ### 6、线程的休眠 ### 可以调用sleep方法使线程挂起休眠,该线程此时从就绪队列被移到阻塞队列,在就绪队列里的线程才能被系统进行调度 ## 二、线程的状态 ## 在Java里有专门用于描述线程状态的词 1、线程开始于结束 NEW:Thread对象创建了,但是没有在内核创建PCB TERMINATEd:内核里的PCB已经销毁,但是Thread对象还在 2、就绪状态 RUNNABLE:线程就绪状态,正在CPU里运行 3、阻塞状态 TIMED\_WAITING:按一定时间阻塞,一般调用sleep WAITING:特殊阻塞等待,使用wait方法 BLOCKED:等待锁的阻塞状态 [97a323d0109c4178a71553034c0fc61e.png]: https://img-blog.csdnimg.cn/97a323d0109c4178a71553034c0fc61e.png [34befb725a6143699e1586f48b152f8e.png]: https://img-blog.csdnimg.cn/34befb725a6143699e1586f48b152f8e.png
还没有评论,来说两句吧...