LockSupport

名词解释

LockSupport是一个在JUC包里的线程阻塞工具类,所有的方法都是静态方法,主要用途是让线程在任意位置阻塞,广泛应用在AQS和各种JUC的锁中。

代码

public static void threadOne(){
System.out.println("当前线程状态1:"+Thread.currentThread().getState()); //RUNNABLE
LockSupport.park();
System.out.println("当前线程状态3:"+Thread.currentThread().getState()); //RUNNABLE
} public void demo(){
Thread t1 = new Thread(LockSupportDemo::threadOne, "t1");
t1.start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("当前线程状态2:"+t1.getState());//WAITING
try {
LockSupport.unpark(t1);
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("当前线程状态4:"+t1.getState());//TERMINATED
}

WaitAndNotify

名词解释

  • Wait

    wait()方法是object类的方法,解决的问题是线程间的同步,该过程包含了同步锁的获取和释放,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify()方法才会重新激活调用者。

注意:线程调用notify()之后,只有该线程完全从 synchronized代码里面执行完毕后,monitor才会被释放,被唤醒线程才可以真正得到执行权。

  • notify

    notify()方法是object类的方法,notify仅唤醒一个线程并允许它去获得锁,notifyAll是唤醒所有等待这个对象的线程并允许它们去获得对象锁。

wait()和notify()方法都需要同一个对象锁进行调用,否则将不会生效。

代码

public static void downLoad(){
//下载图片
for (int i = 0; i < 20; i++) {
try {
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("开始下载图片:"+(i*5+5)+"%");
} catch (InterruptedException e) {
e.printStackTrace();
} }
System.out.println("-----图片下载完毕----");
synchronized (object){
//进行唤醒
object.notify();
}
//下载附件
for (int i = 0; i < 20; i++) {
try {
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("开始下载附件:"+(i*5+5)+"%");
} catch (InterruptedException e) {
e.printStackTrace();
} }
System.out.println("-----附件下载完毕----");
} /**
* @Description: 图片展示
* @Author: zhuyang
* @Date: 2022/1/10 11:09
* @return: void
**/
public static void imgShow(){
synchronized (object){
try {
object.wait();
System.out.println("-----进行图片展示----");
System.out.println("-----图片展示完毕----");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public void demo() throws InterruptedException {
Thread t1 = new Thread(WaitAndNotify::downLoad, "t1");
Thread t2 = new Thread(WaitAndNotify::imgShow, "t2");
t1.start();
t2.start();
t1.join(); }

LockSupport与wait()和notify()区别

①: wait和notify都是Object中的方法,在调用这两个方法前必须先获得锁对象,但是park不需要获取某个对象的锁就可以锁住线程。

②: notify只能随机选择一个线程唤醒,无法唤醒指定的线程,unpark却可以唤醒一个指定的线程。

Gitee地址

https://gitee.com/zhuayng/foundation-study/tree/develop/JavaBasis/JUC/src/main/java/com/yxkj/juc/c_000

最新文章

  1. CI Weekly #4 | 不同规模的团队,如何做好持续集成?
  2. NOI 1.5 44:第n小的质数
  3. OpenResty(nginx_lua_module)做ES代理以及备份ES数据
  4. Oracle性能优化
  5. 手动给控制器添加xib
  6. ln 软链接与硬链接的区别再次回顾
  7. ASP.NET MVC自定义AuthorizeAttribute篇知识点讲解—登录限制
  8. [iOS基础控件 - 6.7] 微博展示 使用代码自定义TableCell(动态尺寸)
  9. [iOS基础控件 - 2] 按钮的基本使用
  10. Android之UI--重绘EditText以及实现Button的渐变色
  11. HDOJ/HDU 1113 Word Amalgamation(字典顺序~Map)
  12. Java IO复习(一)
  13. Android APP开发需求文档范本
  14. JavaScript 中的事件类型4(读书笔记思维导图)
  15. bootstrap - btn 实例
  16. CSS3 transition 浏览器兼容性
  17. 老李分享:性能测试你不应该只知道loadrunner(1)
  18. 三台机器之间ssh互信配置
  19. 如何快速上手一个新技术之vue学习经验
  20. 2. mysql 语句

热门文章

  1. 如何基于LSM-tree架构实现一写多读
  2. Capstone CS5266替代AG9311 Type-C转HDMI带PD3.0+USB3.0拓展坞方案
  3. 过年有燃放烟花爆竹禁令那我们用css写一个仙女棒烟花看看吧
  4. CSS基础-7 盒子模型大小
  5. centos6.5-DNS搭建
  6. Python基础之pytest参数化
  7. 04.python哈希表
  8. Pytest_在jenkins中使用allure报告(13)
  9. Zabbix监控报警Lack of free swap space on Zabbix server解决办法
  10. BeanUtils.copyProperties 选择性赋值字段