1、停止线程
1.1、停止线程的三种方式
- 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
- 使用stop方法强制终止线程,但是不推荐使用这个方法,因为stop和suspend及resume一样,都是作废过期的方法,使用它们可能产生不可预料的结果。
- 使用interrupt方法中断线程,interrupt并不直接停止线程,而是通过状态判断。
1.3、判断线程是否是停止状态
如何判断线程的状态是不是停止的,Thread.java类里提供了两种方法:
- this.interrupted() :测试当前线程是否已经中断,内部实现是调用的当前线程的isInterrupted(),并且会重置当前线程的中断状态 。
- this.isInterrupted():测试线程是否已经中断, 不会重置当前线程的中断状态
1.4、在沉睡中停止线程
- 如果在sleep状态下停止某一线程(interrupt),会进入catch语句,并清除停止状态值为false。
- 先interrupt后sleep也会进入catch语句。
2、暂停线程
暂停线程意味着此线程还可以恢复运行。在Java多线程种,可以使用suspend()方法暂停线程,使用resume()方法恢复线程的执行。
- suspend不会释放当前线程占用的锁。
- suspend也会造成线程不同步的情况。
3、yield方法
yield()方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又会的CPU时间片。
4、线程种优先级
线程的优先级分为1~10这10个等级,如果小于1或大于10,则JDK抛出异常。
- 线程的优先级具有继承性,比如A线程启动B线程,则B线程的优先级与A是一样的。
- 高优先级的线程总是大部分执行完,但不代表高优先级的线程全部先执行完。当线程优先级的等级差距很大时,谁先执行完和代码的调用顺序无关。
5、守护线程
在Java线程种有两种线程,一种是用户线程,另一种是守护线程。守护线程是一种特殊的线程,它的特性有“陪伴”的含义,当进程中不存在非守护线程了,则守护线程自动销毁。