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

目录
相关文章
|
22天前
|
Java API C++
Java 8 Stream Api 中的 peek 操作
本文介绍了Java中`Stream`的`peek`操作,该操作通过`Consumer<T>`函数消费流中的每个元素,但不改变元素类型。文章详细解释了`Consumer<T>`接口及其使用场景,并通过示例代码展示了`peek`操作的应用。此外,还对比了`peek`与`map`的区别,帮助读者更好地理解这两种操作的不同用途。作者为码农小胖哥,原文发布于稀土掘金。
Java 8 Stream Api 中的 peek 操作
|
11天前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
32 6
|
9天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的探索
【9月更文挑战第24天】本文将深入浅出地介绍Java 8中的重要新特性——Lambda表达式和Stream API,通过实例解析其语法、用法及背后的设计哲学。我们将一探究竟,看看这些新特性如何让Java代码变得更加简洁、易读且富有表现力,同时提升程序的性能和开发效率。
|
7天前
|
SQL Java Linux
Java 8 API添加了一个新的抽象称为流Stream
Java 8 API添加了一个新的抽象称为流Stream
|
13天前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
22 7
|
10天前
|
存储 前端开发 API
告别繁琐,拥抱简洁!Python RESTful API 设计实战,让 API 调用如丝般顺滑!
在 Web 开发的旅程中,设计一个高效、简洁且易于使用的 RESTful API 是至关重要的。今天,我想和大家分享一次我在 Python 中进行 RESTful API 设计的实战经历,希望能给大家带来一些启发。
25 3
|
10天前
|
Java
flyway报错Caused by: java.lang.NoSuchMethodError: org.flywaydb.core.api.configuration.FluentConfigurat
flyway报错Caused by: java.lang.NoSuchMethodError: org.flywaydb.core.api.configuration.FluentConfigurat
14 2
|
14天前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
54 1
|
25天前
|
监控 Java 大数据
【Java内存管理新突破】JDK 22:细粒度内存管理API,精准控制每一块内存!
【9月更文挑战第9天】虽然目前JDK 22的确切内容尚未公布,但我们可以根据Java语言的发展趋势和社区的需求,预测细粒度内存管理API可能成为未来Java内存管理领域的新突破。这套API将为开发者提供前所未有的内存控制能力,助力Java应用在更多领域发挥更大作用。我们期待JDK 22的发布,期待Java语言在内存管理领域的持续创新和发展。
|
21天前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
32 2
下一篇
无影云桌面