Java多线程技能
在Java中有3种方法可以使正在运行的线程终止运行:
- 使用退出标志使线程正常退出
- 使用
stop()
方法强行终止线程,但是这个方法不推荐使用, 因为stop()
和suspend()
及resume()
一样,都是作废过期的方法,使用它们可能发生不可预料的结果 - 使用
interrupt()
方法中断线程
this.interrupted()和this.isInterrupted()两个方法的区别
- this.interrupted():测试当前线程师傅已经使中断状态,执行后具有清除状态标志值为false的功能
- this.isInterrupted():测试线程Thread对象是否已经使中断状态,不清除状态标志
停止线程
- 如果线程在
sleep
状态下停止,则该线程会进入catch语句
,并且清除停止状态值,变成false
- 不管其调用的顺序,只要interrupt()和sleep()方法碰到一起就会出现异常:
- 在sleep状态执行interrupt()方法会出现异常
- 调用interrupt()方法给线程打了中断的标记,再执行sleep()方法也会出现异常
- stop()方法呈删除线程状态,是不再被采用的方法,原因是stop()方法容易造成业务处理的不确定性
- 在任意时机对A线程调用stop()方法,A线程并不能确定在哪里被停止了
- 因为如果暴力性地强制让线程停止,则一些清理性对工资可能得不到完成,或者数据添加不完整
- 将interrupt()方法与
抛异常
法结合实现停止线程, 因为在catch块中可以对异常对信息进行统一对处理
暂停线程
暂停线程意味着此线程还可以恢复运行,在Java多线程中,可以使用suspend()
方法暂停
线程,使用resume()
方法来恢复
线程的执行
- 如果suspend()方法与resume()方法使用不当,极易造成公共同步对象被独占,其他线程无法访问公共同步对象的结果
要想实现对线程进行暂停与恢复对处理,可使用wait(),notify()或notifyAll()方法
yied()方法
对作用是放弃当前对cpu资源,让其他任务去占用cpu执行时间,放弃的时间不确定,有可能刚刚放弃,马上有获得cpu时间片
线程优先级的继承特性
- 线程的优先级具有继承性
- A线程启动B线程,则B线程的优先级与A线程是一样的
- spu尽量将执行资源让给优先级比较高的线程
守护线程
Java中有两种线程: 守护线程, 非守护线程(用户线程)
- 守护线程是一种特殊的线程,当进程中不存在非守护线程来,则守护线程自动销毁.
典型的守护线程是垃圾回收线程 只有当最后一个非守护线程结束时,则守护线程随着JVM一同结束工作
- 即当最后一个用户线程销毁来,守护线程退出,进程也随即结束了
Reference : Java Multi-thread Programming (Second Edition)