7:Multithreading-Java API 实战(下)

简介: 7:Multithreading-Java API 实战

10. 匿名内部类创建多线程——你们老师喜欢的


Runnable接口进行匿名处理



11. 发现问题,提出synchronized的概念和用途


现实情况中,抢鞋肯定是有延时操作的,如果我们用.sleep()设置每次抢鞋之间的间隙,会产生了一个问题,就是线程不同步导致线程不安全,两个人同时抢了第7双鞋



解决这个问题要用到线程同步,及时更新数据,即创建一个synchronized锁对象,同步数据



12. synchronized同步方法


如何理解锁呢?当用户一抢到第一双鞋时,锁住第一双鞋,其它用户就无法抢了



synchronized可以创建成一个同步方法,将同步代码块抽离出来



13 Lock、ReentrantLock同步锁


synchronized与reentrantLock区别


  • synchronized 不需要用户去手动释放锁,代码执行完后系统会自动让线程释放对锁的占用


  • reentrantLock则需要用户去手动释放锁,如果没有手动释放锁,就可能导致死锁现象



14. Unlock遗留问题,释放锁


释放reentrantLock锁,try catch要放在if外面,最后finally调用reentrantLock.unlock()方法



15. 浅谈synchroized和Lock的区别


  • JDK1.5中,synchroized是重量级操作,性能低效,Lock性能高,更稳定


  • JDK1.6中,synchroized加入很多优化,更加稳定了


锁的释放


  • synchronized以获取锁的线程执行完同步代码,如果线程执行发生异常,jvm会让线程释放锁


  • Lockfinally中必须释放锁,不然容易造成线程死锁


死锁产生


  • synchronized在发生异常时候会自动释放占有的锁,不会出现死锁


  • Lock发生异常时候,不会主动释放,必须手动unlock来释放锁,可能引起死锁的发生


用法


  • synchronized在需要同步的对象中加入,可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象


  • Lock一般使用ReentrantLock类做为锁,通过lock()加锁和unlock()解锁指出,在finally中写unlock()防止死锁


16. Thread API说明


参考:Thread (Java Platform SE 7 ) - Oracle


17. CPU线程调度、Priority线程优先级、优先级常量、剩余小问题


CPU线程调度


  • 每一个线程的优先使用权都是系统随机分配的,人人平等,谁先分配到谁先用


  • 可以设置优先级赋予某一个线程拥有至高适用权,最高为10,最低为1,默认为5,Java可以抢占CPU



线程1-10中,main()主线程的value = 5,创建 MaxPriorityThread 类和MinPriorityThread来查看线程执行顺序



.start()前面加优先级.setPriority()方法即可越权



但有时会发现优先级没有调换过来,是操作系统的原因,程序执行太快了没有反应过来,还没调度程序就结束了



18. join线程插队


.join()方法可以抢占优先级,实现插队



19. sleep线程休眠


还是上一个例子,使用.sleep()方法休眠后,thread_1线程插队时,会等待1000毫秒再打印出结果



20. yield线程让步


.yield()方法可以实现线程让步,让其它线程执行,thread_1输出一次的时候给thread_2让步了,有时程序运行的太快了,以至于还没打印出让步输出,thread_2已经输出完毕了



21. 线程状态?嗯,还是来玩一盘游戏吧!


Java中线程的状态分为6种–以斗地主为例


1.新建(NEW)-新建一局游戏


2.可运行(RUNNABLE)-初始状态是可运行的


3.阻塞(BLOCKED)-谁出牌谁获得一个锁,导致阻塞,出好牌则疏通阻塞


4.等待(WAITING)-不出牌的等待通知


5.计时等待(TIMED_WAITING)-出牌时,其他人计时等待超时或通知


6.终止(TERMINATED)-游戏结束



参考: Java线程的6种状态及切换(透彻讲解)


22. 发现实际问题,抛出线程通信的含义


线程优先级


  • Win10任务管理器中,线程有6个优先级设置


  • 线程的调度目的就是通知另一个线程去执行,也有其它办法去通知



23. 线程的通信:wait和notify


线程通信,即等待唤醒机制


  • 最简单的例子如Producer生产者与Customer消费者和Condom产品的关系


  • 当产品Condom产品生产出来之后,消费者购买完,需要联系Producer厂商继续生产


  • .notify() 方法用于唤醒一个在此对象监视器上等待的线程


  • 一个线程在对象监视器上等待可以调用 .wait() 方法




24. notifyAll


.notifyAll()方法用于唤醒在该对象上等待的所有线程


25. 提及Process进程。点到为止,章节结束语和建议。


多线程掌握基础,当学习到框架时,需要深入并发编程


参考:操作进程拓展Class ProcessBuilder

目录
相关文章
|
10天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
1月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
61 2
|
7天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
17天前
|
JSON BI API
商城上货API接口的实战案例
在商城上货过程中,API接口扮演着至关重要的角色。以下是对商城上货API接口的实战分析,涵盖其主要功能、类型、安全性以及实战案例等方面。
|
14天前
|
XML 数据可视化 API
商品详情数据实战案例,API接口系列
淘宝商品详情数据在电商领域具有广泛的应用价值,而淘宝商品详情API接口则为开发者提供了获取这些数据的重要途径。通过合理利用这些接口和数据,可以提升业务效率、优化用户体验,为电商行业的发展注入新的活力。
|
18天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
47 4
|
18天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
33 1
|
24天前
|
存储 JSON API
淘宝API接口实战:高效获取商品标题、分类及店铺名称
在淘宝API接口实战中,通过以下步骤高效获取商品标题、分类及店铺名称:1. 准备工作:了解淘宝开放平台文档,注册开发者账号,选择开发语言和工具。2. 获取API访问权限:申请相应权限,提供应用场景说明。3. 调用API接口:构建HTTP请求,提供必要参数。4. 解析响应数据:提取JSON数据中的所需信息。5. 数据处理和存储:进一步处理并存储数据。6. 注意事项:遵守使用规范,注意调用频率和数据安全。示例代码使用Python调用淘宝API。
|
26天前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
1月前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
下一篇
无影云桌面