java线程几种阻塞方法对比

Java线程生命周期

在这里插入图片描述

Java中常用的几种阻塞方法

通过上图中的线程生命周期图可知,常用的几种阻塞方法主要有: Thread.sleep(), LockSupport.park(), Object.wait

阻塞方法对比

在这里插入图片描述
在这里插入图片描述

Object.wait()相关

方法描述
Object.wait()阻塞当前线程,同时释放锁,并等待另一个线程调用Object.notify()或者Object.notifyAll()
Object.wait(timeout)阻塞当前线程,同时释放锁,并等待时间到或者另一个线程调用Object.notify()或者Object.notifyAll()
Object.notify()从所有等待Object monitor的线程中选取一个线程唤醒并去抢占Object的monitor,如果抢占成功,则会有cpu调度的机会
Object.notifyAll()唤醒所有等待Object monitor的线程同时所有唤醒线程重新去获取object的monitor,如果抢占成功,则会有cpu调度的机会

Thread.sleep()相关

Thread.sleep(timeout): 阻塞当前线程,同时不释放资源锁

LockSupport.park()相关

方法描述
LockSupport.park()阻塞线程,同时消耗1个许可,当另一个线程调用对当前线程的unpark()方法,才会唤醒
LockSupport.parkUntil(timeout)阻塞线程,当timeout时间到或者另一个线程调用对当前线程的unpark()方法,才会唤醒等待或者cpu并继续执行后续代码
LockSupport.parkNanos(timeout)阻塞线程,当timeout时间到或另一个线程调用当前线程的unpark()方法,才会唤醒等待或者cpu并继续执行后续代码
LockSupport.unpark(Thread)调用某个线程的unpark方法,则指定线程会唤醒park()线程

版权声明:本文为qinwuxian19891211原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。