理解 Thread 线程类的方法

  JDK 自带的线程类实现了 Runnable 接口,提供了很多方法来支持对线程的操作,可以获取线程ID,线程名,判断线程是否存活等。

Thread 类方法

  1. currentThread()

    返回当前正在执行的线程对象的引用。即返回代码段正在初哪个线程调用。

  2. isAlive()

    判断当前线程是否处于活动的。即一个线程已启动且尚未终止,该线程就是活动的。

    注意:如果将线程对象以构造参数的方法传递给 Tread 对象执行 start() 启动。Thread.currentThread() 指外部主动发起调用的线程,this.currentThread() 指内部创建的线程,两者略有区别。

  3. sleep(long millis)

    让当前正在执行的线程休眼(暂停执行) millis 毫秒。

  4. getId()

    获取线程唯一标识。

  5. interrupt()

    停止线程,此方法仅仅是在当前线程中打了一个停止的标记,并不是真的停止线程,即不会终止一个正在运行的线程。

  6. interrupted()

    是个静态方法,检查当前线程是否已经中断,当前线程指 this.interrupted() 方法的线程。线程的中断状态由该方法清除,如果第二次调用该方法,返回 false(因中断状态已由第一次调用已清除)。

  7. isInterrupted()

    非静态方法,检查线程是否已经中断。该方法并不会清除中断状态标志。

  8. 停止线程异常法

    使用 interrupt() 方法给当前线程添加终止标记,调用 interrupted() 判断标记是否存在,存在的话抛出 InterruptedException 类型异常来终止运行中的线程。

  9. 停止睡眠状态的线程

    对睡眠状态的线程调用 interrupt() 方法,会抛异常:sleep interrupted,并且清除停止状态值。

    另一种情况:先调用 interrupt() 方法停止线程,再遇到 sleep() 方法,也会抛出同样的异常。

  10. **stop()**:暴力停止线程

    该方法已弃用,后续可能删除。掉用该方法会抛出 java.lang.ThreadDeath 异常,通常情况下,此异常可不捕抓。
    强制停止线程可能使一些清理工作不能完成。另一个情况是对锁定的对象进行了解锁,异常数据得不到同步处理,出现数据不一致问题,程序处理的数据可能被破坏,最终导致程序执行流程错误。

  11. 使用 return 停止线程

    run() 方法中使用 return,调用 isInterrupted() 方法判断终止标志,线程对象 interrupt() 方法,会终止线程。

    但仍建议使用 抛异常 来停止线程,可以 catch 中对异常信息进行相关处理。

  12. 暂停与恢复线程:suspend() 与 resume()

    线程中使用 suspend() 方法暂停线程,调用 resume() 恢复线程。此两个方法极易造成公共的同步对象的独占,使得其他线程无法访问公共同步对象。

    这两个方法可能导致数据不同步,例如一个线程里赋两个值,在赋第一个值时暂停了,此时其他线程取到的则是不同步的两个值。

    注意:如果线程调用了 suspend() 方法,后面跟了 System.out.println() 方法,因 println() 方法加了当前对象锁,导致 锁未释放,一直不能输出打印。

  13. yield()

    放弃当前的 CPU 资源,让给其它任务占用 CPU 执行时间。但放弃是不确定的,有可能刚放弃,马上又获得 CPU 时间片。

线程优先级

在操作系统中,线程可以划分优先级,CPU 优先执行优先级较高的线程对象的任务。

setPriority(int i)

设置线程优先级,有助于线程规划器确定下一次选择哪 一个线程来优先执行。

在 Java 中,线程优先级分为 1 ~ 10 共 10 个等级,最小是 1,最大是 10,默认为常规是 5.

1
2
3
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;

优先级具有继承的特性,A 线程启动了 B 线程,B 线程的优先级与 A 一致。

高优先级线程总是大部分先执行完,但不代表高优先级的线程全部先执行完。当线程优先级的等级巨大时,谁先执行完和代码的调用顺序没有关系。

优先级还具有随机性,也就是优先级较高的线程不一定每一次都先执行完。不要把线程的优先级顺序与运行结果的顺序,也就是线程优先级与打印顺序无关,不要将两个关联,它们的关系具有不确定性和随机性。

守护线程

setDaemon(boolean b)

Java 线中有两种线程,一种是用户线程,另一种是守护(Daemon)线程。

守护线程是一种特殊线程,具有陪伴的含义。当主线程不存在时,守护线程自动销毁。典型的守护线程是垃圾回收线程。守护线程随着 JVM 一同结束工作。

守护线程的作用是为其他线程的运行提供便 利服务。

作者

光星

发布于

2019-05-22

更新于

2022-06-17

许可协议

评论