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

目录
相关文章
|
2月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
26天前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
27天前
|
缓存 自然语言处理 API
阿里巴巴国际站关键字搜索 API 实战:3 步搞定多语言适配 + 限流破局,询盘量提升 40%
跨境电商API开发常陷合规、多语言、限流等坑。本文详解从国际合规(GDPR/CCPA)到参数优化、数据结构化及区域化搜索的全链路方案,附Python代码模板与缓存重试架构,助力提升调用成功率至99%+,精准询盘增长42%。
|
1月前
|
安全 Java 开发者
告别NullPointerException:Java Optional实战指南
告别NullPointerException:Java Optional实战指南
227 119
|
1月前
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
Python API接口实战指南:从入门到精通
|
2月前
|
数据采集 缓存 API
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
本文详解小红书笔记详情API的开发对接、实战场景与收益模式,涵盖注册避坑、签名生成、数据解析全流程,并分享品牌营销、内容创作、SAAS工具等落地应用,助力开发者高效掘金“种草经济”。
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
|
1月前
|
开发者 API 机器学习/深度学习
淘宝 / 1688 / 义乌购图搜 API 实战指南:接口调用与商业场景应用
本文详解淘宝、1688、义乌购三大平台图片搜索接口的核心特点、调用流程与实战代码。涵盖跨平台对比、参数配置、响应解析及避坑指南,支持URL/Base64上传,返回商品ID、价格、销量等关键信息,助力开发者快速实现商品识别与比价功能。
淘宝 / 1688 / 义乌购图搜 API 实战指南:接口调用与商业场景应用
|
2月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
874 8
|
2月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
399 12
|
30天前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。