在多线程使用过程中,有一些常见的使用场景,例如线程等待与唤醒,线程同步等等,这些使用场景需要使用不同的方法组合实现。
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线程执行完。