LockSupport工具类
主要用来,阻塞和唤醒线程,可以方便的用来实现线程间的通信,
public class LockDemo {
static final Logger LOGGER = LoggerFactory.getLogger(LockDemo.class);
static volatile Object result = null;
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{getResult();});
thread.start();
TimeUnit.SECONDS.sleep(3);
result = "hello";
LOGGER.info("set result = [{}]",result);
// thread.interrupt();
LockSupport.unpark(thread);
}
public static void getResult(){
// 非条件满足的唤醒,仍然等待
while(result == null){
LockSupport.park();
}
LOGGER.info("get result:[{}]",result);
}
}
如上,所示:创建了一个线程thread,thread需要获取result的值。然鹅result的初始状态为null,只有当main线程将其初始化后,thread才可以拿到其值,也就是说thread需要等待main线程对result进行初始化后,才能继续执行,即是线程之间的一种协作,或者通信。
因为线程调用 LockSupport.park()后,进入阻塞状态,然而线程的中断也可以使得线程唤醒,因此在线程唤醒后,需要重复判断条件,以免非条件满足的唤醒。 需要使用while循环。