理解sleep/wait/notify/countdownlatch/join方法等

在多线程使用过程中,有一些常见的使用场景,例如线程等待与唤醒,线程同步等等,这些使用场景需要使用不同的方法组合实现。

sleep方法

  • sleep方法属于Thread类的静态本地方法,调用方式为Thread.sleep(long millis)
  • sleep方法用于当前线程休眠,并且时间到了之后,当前线程会继续执行,并且sleep只能自动醒来,不能被唤醒。
  • sleep方法一般用于当前线程的暂停或者休眠。
  • sleep方法不会释放锁。
  • sleep会让出cpu执行时间,强制上下文切换。

wait方法

  • wait方法属于Object类的本地方法,调用方式为xxx.wait(long millis)
  • wait方法必须在synchronized块中使用(解决lost wake up问题),也即wait应该在同步代码块中使用。
  • wait一般用于多线程之间的通信。
  • wait方法会释放锁。

notify方法

  • notify方法属于Object类的本地方法,调用方式为xxx.notify()
  • notify方法随机唤醒一个处于wait的线程。
  • notify方法并不会立马释放锁,必须等到synchronized方法或者代码块执行完毕之后,才会真正释放锁。

notifyall方法

  • notifyall方法属于Object类的本地方法,调用方式为xxx.notifyall()
  • notifyall方法会唤醒所有处于wait的线程,共同竞争锁,只有真正获取到锁对象的线程才能继续执行。
  • notifyall方法并不会立马释放锁,必须等到synchronized方法或者代码块执行完毕之后,才会真正释放锁。

countdownlatch方法

  • countdownlatch方法用于多线程之间的同步。
  • 主要有两个方法await()与countDown()。
  • await()方法使调用线程处于等待状态,并且可以有多个线程调用await()方法,多个线程均处于等待状态,以共享模式使用同一把锁。
  • countDown()方法用于使计数器减一,并且允许同一个线程多次调用该方法。
  • 当计数器减为0时,所有处于等待状态的线程,均被唤醒,继续执行。

join方法

  • 属于Thread类的方法。
  • join方法主要用于线程同步,可以让线程执行从串行变为并行。
  • join(10)表示A线程会等待B线程执行10毫秒,join(0)等同于join()表示A线程会等待B线程执行完。