Administrator
Published on 2021-12-15 / 121 Visits
0
0

JUC之LockSupport与线程中断

LockSupport与线程中断

线程中断机制

  • 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了
  • 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作,因此,Java提供了一种用于停止线程的机制——中断
  • 中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现
  • 若要中断一个线程,你需要手动调用该线程的 interrupt 方法,该方法也仅仅是将线程对象的中断标识设成 true,接着你需要自己写代码不断地检测当前线程的标识位,如果为 true,表示别的线程要求这条线程中断,此时究竟该做什么需要你自己写代码实现
  • 每个线程对象中都有一个标识,用于表示线程是否被中断,该标识位为 true 表示中断,为false表示未中断,通过调用线程对象的interrup t方法将该线程的标识位设为 true,可以在别的线程中调用,也可以在自己的线程中调用

中断API

API备注
public void interrupt()实例方法 interrupt() 仅仅是设置线程的中断状态为true,不会停止线程
public static boolean interrupted()返回当前线程的中断状态并将当前线程的中断状态设为false
public boolean isInterrupted()判断当前线程是否被中断(通过检查中断标志位)

线程等待唤醒机制

线程等待和唤醒的方法

  • 方式1:使用 Object 中的 wait() 方法让线程等待,使用 Object 中的 notify() 方法唤醒线程
    • wait 和 notify 方法必须要在同步块或者方法里面,且成对出现使用
    • 必须先 wait 后 notify
  • 方式2:使用 JUC 包中 Condition 的 await() 方法让线程等待,使用 signal() 方法唤醒线程
    • Condtion 中的线程等待和唤醒方法之前,需要先获取锁
    • 必须先 await 后 signal
  • 方式3:LockSupport 通过 park() 和 unpark(thread) 方法来实现阻塞和唤醒线程的操作
    • 无锁块要求
    • 无需遵循先阻塞再唤醒的步骤

Comment