设置成后台(守护)进程
咱们默认创建的线程是"前台线程",前台线程会阻止进程退出,如果主线程(main线程)运行完了,前台线程还没完,则进程不会退出(主线程也是前台线程)
如果是"后台线程",后台线程不会阻止进程退出,如果其他前台线程都执行完了,那么即使后台线程没有执行完,进程也会退出
写法:线程对象名.setDaemon(true);
线程中断
线程中断就是让线程提前结束,本质上是让run方法尽快结束,而不是强制结束run方法
第一种方法:自定义标志位,作为线程是否结束的标记(在主线程中调节标记的true or false)
第二种方式:使用标准库中自带的标志位
1、设置标志位:Thread.currentThread().isInterrupted();
currentThread方法是Thread的静态方法,通过这个方法可以拿到当前线程的Thread对象,isInterrupted方法判断是否被中断
2、中断线程:线程对象名.interrupt();
如果要中断的线程当前在运行状态,则会设置标志位为true,如果线程当前在阻塞状态(sleep),不会设置标志位,而是会触发一个InterruptedException异常,这个异常会把sleep提前唤醒(如果要结束循环直接break掉)
java中线程的状态
在操作系统中,对于PCB有一个状态的描述,但是java觉得自带的状态不是特别合适,因此自己又搞了一套状态规则
NEW:Thread对象创建出来了,但是还没有真正的创建线程(内核的PCB还没有创建)
TERMINATED:真正的线程已经销毁了(内核的PCB已经销毁),但是Thread对象还在
RUNNABLE:就绪状态(正在CPU上运行+在就绪序列中排队)
TIMED_WAITING:按照一定的时间来阻塞(sleep)
WAITING:特殊的阻塞状态,调用wait
BLOCKED:等待锁的时候进入阻塞状态
Thread常见属性
ID---获取方法:getId()
这个ID是java中给Thread对象安排的身份标识,和操作系统内核中的PCB中的pid以及和操作系统中的线程ID都不是一回事
名称---获取方法:getName()
这个名称是刚才给线程起名字的那个名字
状态---获取方法:getState()
优先级---获取方法:getPriority()
是否是后台线程(守护线程)---获取方法:isDaemon()
线程是否存活---获取方法:isAlive()
是否被中断---获取方法:isInterrupted()