7:Multithreading-Java API 实战(上)

简介: 7:Multithreading-Java API 实战

1. 问题的提出


一台计算机为何能够执行多个程序?它们是怎么执行多个程序的?


  • 电脑可以同时做很多事情,一边聊天,一边听歌,一边上网查资料等


  • 原因是电脑有多个核心(脑子),一个核心可以做一件事情,多个核心就可以做多件事情


  • 而多线程就是一台电脑,CPU可以同时运行两个程序(表面上),实际上是进程切换的快,第一个进程打开,第二个进程挂起,给你一种错觉



例如CPU的6核12线程,就相当于有6个工人去运行进程



2. 核心数、进程、线程


  • 一个核心下有多个进程,而一个进程下又会有多个线程


3. 进程和线程的区别以及对应应用


进程和线程的区别


  • 线程只是一个进程中不同执行的路径


  • 进程与进程之间不会相互影响,因为它们是占有独立内存的


  • 而线程是占用共同的内存,所以一个线程出问题,那这个进程下的线程都会出问题


  • 多进程的程序要比多线程的程序健壮,而多线程运行效率更高,但是线程不能独立执行,必须依存在应用程序中,操作系统不会把线程看作多个独立应用


  • 但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。例如很多人共同抢一双鞋,就要用到多线程


并发与并行


  • 并发(Concurrent)指一个CPU需要进行多个进程,这样就需要不停的切换,让进程不断的交替执行


  • 并行(Parallel)指多个CPU同时执行多个进程


4. 多线程程序含义、多线程的作用


创建多线程DemoThread类,Alt+Insert调出Generate选择Override Methods



选择run():void



mainThreadDemoThread两个字符串交替执行



如果用.run()的话会出现问题,死循环一直在跑,用.start()可以多开启一个线程,然后去自动调用.run(),再继续进行当前线程



显示的结果是两个死循环的内容在交替执行,其原因就是使用了.start()后两个线程一直在执行


5. 多线程的执行过程


多线程的执行方式


  • 一般的程序是从main出发,直线向下进行,只有一条主线


  • 多线程在main主线程序遇到线程程序时会转到线程程序,并返回到主线程序中,这样main程序和线程程序同时执行



6. Runnable


前面我们创建线程单继承了Thread,无法继承别的类,因为Java不支持多继承

使用Runable接口来创建线程,要使用其方法,必须创建Thread对象实现



Ctrl + 左键查看Thread源码



源码中,Thread类就是实现了Runnable接口,而在Thread的构造方法中也有许多方法函数需要传递Runnable接口类型



而我们在主函数中实现的应该是第一种传递方式,Thread的构造方法还有很多方式,这些构造函数都有一个特点就是全部使用init这个方法对线程进行实现


init源码的变量注释及源码


  • 在原始的init中名字是不能为空的,如果名字为空会报空指针异常,但是在其他的函数中,如果程序员不给thread.name赋值的话也可以自动生成一些值


  • 涉及线程组相关的安全问题


  • 变量的赋值和其他函数的初始化相关




下面init方法是对上面的函数的衍生,是构造方法中使用的初始方法



7. 简化操作以及线程名


Thread源码里面有传线程名的构造方法,要在原来线程类中自动获取我们在主线程中设置的名字,使用Thread.currentThread().getName()方法,.currentThread()是指当前线程,.getName()是指获取名字



8. 抢购鞋——多线程案例


两种创建线程的方式,一种使用继承,一种使用接口实现,解决了线程名的问题,接下来我们模拟一个多线程的抢鞋程序


抢鞋的逻辑代码涵盖在线程当中,假设有10双鞋,有三个人来抢,一个线程就是一个用户,所以这就有三个名称不一样的线程名


使用Runnable接口创建



9. 后台、守护进程的提出


电脑任务管理器


  • Apps是前台进程,Background processes是后台进程也叫守护进程,这些进程在电脑开机时就被启动,这样电脑才能正常且安全的运作起来,在程序中也是同理


  • 与进程同理,前台线程为用户提供服务,也有后台线程为前台线程提供的服务进行保护或者守护



后台线程的创建过程


  1. 创建一个DaemonThread,实现Runnable接口


  1. 重写run()方法


  1. 在运行类中创建先一个DaemonThread,再用 Thread 用来实现DaemonThread


  1. 最后调用setDaemon(true) 设置成后台守护线程,.start()开启线程



目录
相关文章
|
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
下一篇
无影云桌面