线程可以交由另一个线程去运行run方法,此时该线程调用isAlive()时,返回false
判断线程是否停止使用 this.interrupted() this.isInterrupted()
this.interrupted() 静态方法 判断停止的是运行该语句的线程 该方法能够清除状态,即两次调用第二次将返回false(中断状态被清除)this.isInterrupted() 非静态方法 判断停止的是this线程 不清楚中断标志
线程停止使用 interrupt()函数 但不会真正的中止线程 而是给线程做个中止标记,若想让线程真正停止(也可以使用return语句),则在判断其被标记停止后,要主动抛出InterruptedException异常(throw);如果线程在睡眠状态被标记中止,则直接jvm直接抛出InterruptedException,不需要程序主动抛出
stop()方法停止线程是采用暴力停止的方式,直接中断线程,并抛出ThreadDeath异常(无需显示捕获)
该方法已被废弃,原因是强制性中止线程将会导致一些请理性的工作无法完成,而且对锁定的对象进行了解锁,导致数据得不到同步处理,出现数据不一致的问题
sleep和wait的区别sleep 释放cpu资源一段时间,不释放已获取的锁wait 释放CPU资源一段时间,释放已获取的锁
线程停止和挂起
suspend()挂起 resume()停止这两个方法已被废弃,原因在于 两个方法在运行时时独占式的,使用不当很容易造成公共的同步对象的对战,使得其他线程无法访问公共同步对象
yield方法
放弃当前cpu资源,将它让给其他的任务去占用CPU执行时间。 注:放弃时间不确定。
线程优先级
1~10 优先级逐次升高;优先级有继承性,若A线程启动了B线程那么 B具有和A线程同样的优先级 默认优先级都为5
图1-53是main函数中注释掉设置优先级的结果 图1-54是取消注释的结果可以看到 在更改了线程的优先级后,被main启动的线程就改变了优先级。 (图片来自于《Java多线程编程核心技术》)
守护线程
当进程中不存在非守护线程了,则守护线程自动销毁。e.g. 垃圾回收线程将一个线程设置为守护线程只需要调用setDaemon(true)即可