网站域名中请勿使用二级目录形式/软文推广有哪些
目录
一、为什么要有多线程?
1、线程与进程
2、多线程的应用场景
3、小结
二、多线程中的两个概念(并发和并行)
1、并发
2、并行
3、小结
三、多线程的三种实现方式
1、继承Thread类的方式进行实现
2、实现Runnable接口的方式进行实现
3、利用Callable接口和Future接口方式的实现
4、多线程三种实现方式对比
四、常见的成员方法
1、get/setName方法 -- 线程名字
2、currentThread方法 -- 获取当前线程对象
3、sleep方法 -- 线程休眠
4、set/getPriority方法 -- 线程优先级
5、setDaemon方法 -- 守护线程
6、yield方法 -- 礼让线程
7、join方法 -- 插入线程
8、线程的生命周期
五、线程安全的问题
1、练习:设计一个程序模拟电影院卖票
2、买票引发的安全问题
①、重复票的由来:(线程在执行代码的过程中,CPU的执行权随时有可能被抢走)
②、出现了超出范围的票:(和上面的原因相同)
3、安全问题的解决办法 -- 同步代码块
4、同步代码块中的两个小细节
①、细节1:synchronized要写在循环的里面
②、细节2:synchronized中的锁对象一定是唯一的
5、同步方法
6、StringBuilder和StringBuffer的区别
7、Lock锁(手动加锁、释放锁)
①、Lock使用不规范造成的两个安全问题
六、死锁
七、生产者和消费者(等待唤醒机制)
1、消费者等待
2、生产者等待
3、常见方法(wait/notify/notifyAll)
4、消费者与生产者代码实现
①、Cook.java
②、Desk.java
③、Foodie.java
④、ThreadDemo.java
5、阻塞队列方式(另一种等待唤醒机制)
①、阻塞队列的继承结构
②、阻塞队列实现等待唤醒机制
7、多线程的6中状态
八、综合练习
1、多线程练习1(卖电影票)
2、多线程练习2(送礼品)
3、多线程练习3(打印奇数数字)
4、多线程练习4(抢红包)
精确运算:(BigDecimal)
5、多线程练习5(抽奖箱抽奖)
6、多线程练习6(多线程统计并求最大值)
7、多线程练习7(多线程之间的比较)
8、多线程练习8(多线程阶段大作业)
九、线程池
1、吃饭买碗的故事
①、问题
②、解决方案
2、以前写多线程的弊端
3、线程池的核心原理
4、线程池的代码实现
①、Executors工具类
②、线程复用示例
③、创建一个有上限的线程池
5、自定义线程池(ThreadPoolExecutor)
①、任务拒绝策略
②、代码实现
③、小结
6、最大并行数
①、什么是最大并行数?
②、向Java虚拟机返回可用处理器的数目
7、线程池多大才合适?
十、多线程的额外扩展内容
一、为什么要有多线程?
1、线程与进程
举例:在任务管理器中,一个软件运行之后,它就是一个进程
线程:(简单理解,线程就说应用软件中互相独立,可以同时运行的功能)
单线程程序:所有的都在一个线程中执行,耗时长
2、多线程的应用场景
3、小结
二、多线程中的两个概念(并发和并行)
1、并发
2、并行
以2核4线程为例:(如果计算机中只要4条线程,那么它是不用切换的,但如果线程越来越多,那么这个红线就会在多个线程之间随机的进行切换)
3、小结
三、多线程的三种实现方式
1、继承Thread类的方式进行实现
代码实现:
①、自己定义一个类继承Thread并重写run方法
②、创建子类的对象,并启动线程
2、实现Runnable接口的方式进行实现
代码实现:
①、自己定义一个类实现Runnable接口,并重新里面的run方法
②、创建自己的类对象
③、创建一个Thread类的对象,并开启线程
示例代码:
3、利用Callable接口和Future接口方式的实现
代码实现:
①、创建一个类MyCallable实现Callable接口,并重写call
②、创建MyCallable/FutureTask/Thread的对象
完整代码:
4、多线程三种实现方式对比
四、常见的成员方法
1、get/setName方法 -- 线程名字
默认名字的由来:
序号自增
细节:
2、currentThread方法 -- 获取当前线程对象
3、sleep方法 -- 线程休眠
4、set/getPriority方法 -- 线程优先级
抢占式调度:随机性
非抢占式调度:轮流
没有设置,优先级则默认为5,优先级越高,抢到CPU的概率就越高
示例代码:
5、setDaemon方法 -- 守护线程
两个线程执行的代码不同:守护线程是陆续结束的,所以守护线程也叫做备胎线程
守护线程的应用场景:
6、yield方法 -- 礼让线程
但只是尽可能的均匀,不是绝对的
7、join方法 -- 插入线程
插入线程:将土豆插入到main线程之前,只有当土豆线程执行完毕,才会轮到main线程
8、线程的生命周期
五、线程安全的问题
1、练习:设计一个程序模拟电影院卖票
示例代码:
出现了超出票范围或者重复票的情况:
2、买票引发的安全问题
①、重复票的由来:(线程在执行代码的过程中,CPU的执行权随时有可能被抢走)
②、出现了超出范围的票:(和上面的原因相同)
3、安全问题的解决办法 -- 同步代码块
示例代码:(锁对象一定得是唯一的)
4、同步代码块中的两个小细节
①、细节1:synchronized要写在循环的里面
②、细节2:synchronized中的锁对象一定是唯一的
示例代码:(当前类的字节码文件对象)
5、同步方法
示例代码:
将同步代码块改成同步方法:
6、StringBuilder和StringBuffer的区别
两个类的方法都是相同的
但是StringBuffer是线程安全的,它里面所有的方法都是线程同步的
StringBuilder是非线程安全的,所以如果用到多线程则可以使用StringBuffer,没有需求则选择StringBuilder
7、Lock锁(手动加锁、释放锁)
①、Lock使用不规范造成的两个安全问题
Ⅰ、重复票以及超出范围票
我们在使用Thread类实现多线程时,创建自己的类,一定要注意锁对象需要唯一,即在相关变量前加上static关键字
Ⅱ、程序无法正常终止
这是由于当满足条件时,循环直接被终止,导致lock锁没有被释放
Ⅲ、正确代码(标准写法)
即将容易产生异常的代码块放入try…catch中
六、死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
代码实现:(理解过程)
注意事项:千万不要让两个锁嵌套起来!
七、生产者和消费者(等待唤醒机制)
生产者消费者模式是一个十分经典的多线程协作的模式
1、消费者等待
2、生产者等待
3、常见方法(wait/notify/notifyAll)
4、消费者与生产者代码实现
①、Cook.java
②、Desk.java
③、Foodie.java
④、ThreadDemo.java
5、阻塞队列方式(另一种等待唤醒机制)
①、阻塞队列的继承结构
②、阻塞队列实现等待唤醒机制
Cook.java:
put方法的源码中实现了Lock锁
Foodie.java:
take方法的底层也是有锁的
ThreadDemo.java:
打印语句是在锁的外面的,但是不会对数据造成影响,只是影响了控制台的打印阅读体验
7、多线程的6中状态
Java中是没有定义运行状态的,只有以下6种状态,这是因为一旦线程抢夺到CPU执行权之后,线程就会交给操作系统了,Java就不管了
八、综合练习
1、多线程练习1(卖电影票)
待补充~
2、多线程练习2(送礼品)
待补充~
3、多线程练习3(打印奇数数字)
待补充~
4、多线程练习4(抢红包)
示例代码:
测试类:
精确运算:(BigDecimal)
5、多线程练习5(抽奖箱抽奖)
示例代码:
MyThread.java:
测试类:
6、多线程练习6(多线程统计并求最大值)
示例代码一:(在练习5的基础上进行修改)
MyThread.java:
示例代码二:升级版--线程栈(示例一可以用,但不好)
改进后,这里只需要一个ArrayList就搞定了
示例二内存图讲解:
每个线程都有自己独立的空间
7、多线程练习7(多线程之间的比较)
示例代码:(难点在于如何获取两个线程中的最大值★)
调用多线程的第三种方式Callable来实现(可以返回结果)
MyCallable.java:
测试类:
8、多线程练习8(多线程阶段大作业)
待补充~
九、线程池
1、吃饭买碗的故事
①、问题
②、解决方案
买个碗柜,买了碗之后不摔,存入碗柜中
2、以前写多线程的弊端
3、线程池的核心原理
当有新的任务出现,且线程池线程不足时,会新建线程以满足需求,其中最大线程的数量可以自行设置
4、线程池的代码实现
①、Executors工具类
示例代码:
MyRunnable.java:
测试类:
②、线程复用示例
测试类:
③、创建一个有上限的线程池
测试类:
5、自定义线程池(ThreadPoolExecutor)
①、任务拒绝策略
以下面示例为例,它会将任务4抛弃,将任务10加入
②、代码实现
③、小结
6、最大并行数
①、什么是最大并行数?
②、向Java虚拟机返回可用处理器的数目
7、线程池多大才合适?
可以通过thread dump来计算CPU的计算时间和等待时间
十、多线程的额外扩展内容
准备面试时可以再突击学习,资料可见《多线程(额外扩展).md》
相关文章:

【Java基础 下】 029 -- 多线程
目录 一、为什么要有多线程? 1、线程与进程 2、多线程的应用场景 3、小结 二、多线程中的两个概念(并发和并行) 1、并发 2、并行 3、小结 三、多线程的三种实现方式 1、继承Thread类的方式进行实现 2、实现Runnable接口的方式进行实现 3、利用…...

R语言生物群落(生态)数据统计分析与绘图
查看原文>>>R语言生物群落(生态)数据统计分析与绘图 R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂,涉及众多统计分析方法。本课程以生物群落数据分析中的最常用的统计方法回归和混…...

浙江首场千人大会现场爆满!实在智能九哥专题演讲:企业数字化转型,从实在RPA开始!
为帮助众多电商商家探索数字时代下新赛道、新趋势、新方向,制定有目标、有节奏的全年生意规划,“未来电商高峰论坛暨电商生态赋能大会”于3月4日在杭州正式拉开序幕。本次大会旨在向品牌电商企业主、运营操盘手分享数字电商时代的黄金趋势及运营策略&…...
Windows 上 执行docker pull命令 提示:The system cannot find the file specified.
错误提示error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/version": open //./pipe/docker_engine: The system cannot find the file specified.解决办法在cmd 窗口中执…...

查看 WiFi 密码的两种方法
查看 WiFi 密码的两种方法1. 概述2. 在控制面板中查看 WiFi 密码3. 使用 CMD 查看 WiFi 密码结束语1. 概述 突然忘记 WiFi 密码怎么办? 想连上某个使用过的 WiFi,但有不知道 WiFi 密码怎么办? 使用电脑如何查询 WiFi 密码? 以下是…...

逻辑优化基础-bi-decomposition
简介 bi-decomposition是逻辑综合中用于简化布尔函数的一种技术。其思想是将函数分成两个较小的函数,每个函数仅取决于所选变量的一个值。这些较小的函数可以使用简单的逻辑门(如AND、OR和NOT门)来实现,然后组合以获得原始函数的…...

Modbus转profinet网关连接1200PLC在博图组态与驱动器通讯程序案例
本案例给大家介绍由兴达易控modbus转profinet网关连接1200PLC在博图软件无需编程,实现1200Profinet转modbus与驱动器通讯的程序案例 硬件连接:1200PLC一台;英威腾DA180系列驱动器一台;兴达易控modbus转profinet网关一台 下面就是…...

Android ART虚拟机 启动和初始化
前言 之前整理了一系列Dalvik虚拟机的关于堆内存和GC的文章,轮到对ART内存进行分析优化了,继续整理输出一波,本篇为ART虚拟机系列的第一篇,介绍ART虚拟机的启动和初始化。 #mermaid-svg-8iNdLFTpOHLgRjHA {font-family:"tre…...

宇视科技一二三面
一面 1、自我介绍 2、堆和栈的区别,堆在数据结构中是如何表示的 3、有用过Linux吗?虚拟空间中用户态是3G,假如计算机的内存是4G,为什么计算机可以运行这些进程 4、虚拟地址到物理地址的映射过程 5、进程间的通信方式 6、共享内存…...

优思学院|盘点,精益生产25个工具!【必需收藏】
精益生产方法需要一种全面的方法才能有效实施。精益这个概念是每个接触产品供应链的人都要实践的,无论是在计划方面还是在分析方面。 精益生产工具有助于持续改进生产效率和产品或服务质量。精益工具是要减少 Muda (浪费),从生产过…...

Linux中将多块新硬盘合并成一个,挂载到/mysqldata目录下
需求: 将两块空硬盘合并为“一块”,挂载到指定目录(/data)下,达到在一个目录使用2块硬盘所有空间的效果。 使用 fdisk -l 命令查看当前系统中的硬盘,如下图: 系统中存在两块未分配的硬盘&#…...

Git的SSH密钥配置
Git的SSH密钥配置简记Githttps和ssh的区别基本需求SSH密钥类型ED25519 SSH 密钥RSA SSH 密钥查看您是否有现有的 SSH 密钥对设置流程设置user name和emailssh密钥配置检查是否存在ssh Key创建新的ssh key将ssh密钥添加到您的Git帐户验证您是否可以连接使用Git有一段时间了&…...

C++回顾(九)——多继承
9.1 多继承 9.1.1 概念 一个类有多个直接基类的继承关系称为多继承(多个父类)多继承声明语法 class 派生类名 : 访问控制 基类名1 , 访问控制 基类名2 , … , 访问控制 基类名n {数据成员和成员函数声明 };类 C 可以根据访问控制同时…...

交流约瑟夫森效应
定理 根据约瑟夫森效应的基本方程,当隧道结两端施加恒定电压V0V_0V0时,结两边超导体波函数的位相差为 Δϕ2eℏV0tΔϕ0\begin{align} \Delta\phi\frac{2e}{\hbar}V_0t\Delta\phi_0 \end{align} Δϕℏ2eV0tΔϕ0 得到超导电流密度为 JsJcs…...

大数据项目实战之数据仓库:用户行为采集平台——第3章 用户行为日志
第3章 用户行为日志 3.1 用户行为日志概述 用户行为日志的内容,主要包括用户的各项行为信息以及行为所处的环境信息。收集这些信息的主要目的是优化产品和为各项分析统计指标提供数据支撑。收集这些信息的手段通常为埋点。 目前主流的埋点方式,有代码…...

centos6下为Rstudio安装多版本R
之前的R版本太旧,不少包装不上,需要安装新版本的R: R --version R version 3.6.0 (2019-04-26) -- "Planting of a Tree"于是下载最新版R: 因为没有证书,需要加上最后面的参数. wget https://mirrors.tuna.tsinghua.edu.cn/CRAN/src/base/R-4/R-4.2.2.tar.gz --no…...

TCL 拥抱云原生,实现 IT 成本治理优化
作者:行疾 TCL 工程师团队基于阿里云企业云原生 IT 成本治理方案沉淀了一套成熟的 IT 企业成本治理流程与系统,通过阿里云容器服务提供的开箱即用的成本洞察、资源智能画像等功能,进行业务成本拆分、闲置资源可视化发现,并制定弹性…...

什么是API接口
API接口是指应用程序接口,是一种让不同的应用程序之间进行数据交互的方式。在现代软件开发中,API接口已经成为了必不可少的一部分。它们让开发者们可以将不同的功能组合在一起,同时也让不同的应用程序之间可以相互连接和通讯。API接口的作用A…...

基于单片机的波形发生器设计
单片机可以用来设计各种类型的波形发生器,下面是一种基于单片机的波形发生器设计方案。所需材料:单片机:可以选择常见的Atmel AVR单片机,如ATmega328P等。调制器:可以使用AD9833或AD9851等常用的调制器。时钟ÿ…...

phpmyadmin SQL注入 (CVE-2020-5504)
文章目录 0x01 漏洞介绍0x02 影响版本0x03 漏洞编号0x04 漏洞查询0x05 漏洞环境0x06 漏洞复现方法一:写入shell方法二:报错注入0x07 修复建议免责声明摘抄0x01 漏洞介绍 phpMyAdmin是phpMyAdmin团队的一套免费的、基于Web的MySQL数据库管理工具。该工具能够创建和删除数据库,…...

华为机试题:HJ107 求解立方根(python)
文章目录(1)题目描述(2)Python3实现(3)知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…...

论文公式符号规范
参考自1,记录论文公式的符号规范: 1.变量和公式符号表达 物理量 物理量符号用英文斜体字母或希腊斜体字母,表示物理量大小用数字加单位,单位使用正体。 例如: m10.05gx10.12ζ35.36mVm10.05 \mathrm{~g} \quad x10…...

哈工大面向服务的软件系统 期末开卷提纲
引言本课程期末考试为开卷,博主2022年期末卷面94/100,总分92.9排名第2/82,现分享复习提纲以供学弟学妹们参考。本提纲仅供参考,切勿进行其他目的的使用。基于2021秋季考试题的思考一、Spring Boot的优点是:1. 非常快速…...

Adding Conditional Control to Text-to-Image Diffusion Models
安全验证 - 知乎知乎,中文互联网高质量的问答社区和创作者聚集的原创内容平台,于 2011 年 1 月正式上线,以「让人们更好的分享知识、经验和见解,找到自己的解答」为品牌使命。知乎凭借认真、专业、友善的社区氛围、独特的产品机制…...

C++从头再来:知识点速通
1. 关于scanf 1.1 读入数字 scanf 的返回值表示成功输入的变量个数,当输入结束时,scanf将无法再次读取数据,返回0 # include <stdio.h> # include <math.h> # include <time.h># define M 1000000; // compute the max,…...

LearnDash Groups学习群组:您需要了解的一切
大约131k 网站使用 LearnDash。因此,毫无疑问,LearnDash是 WordPress 领域中最受欢迎的 LMS。而且,这是因为它具有强大的功能。但让它更受欢迎的是它与大多数第 3 方扩展很好地集成,并且比现有的任何其他 LMS 都更灵活。群组和群组…...

软件开发过程中遇到一个傻嘚业主能让你抓狂
背景 之前的一个网站交付了之后,业主一直未验收,今天忽然间开始了他的扯淡需求调整。 问题1 有一个问题是pdf文件上传显示问题,目前是pdf有一个封面要上传,排序字段可自动调整控制。但是就这么好用的功能,被他给pas…...

信创系统借力小程序应用生态的可能性
随着国内市场需求的不断增长,国产操作系统的应用也开始逐步发展壮大。国产操作系统在与其他操作系统的竞争中,越来越受到用户的青睐。国产操作系统作为一个全新的市场,给应用开发带来了新的机遇和挑战。本文将从国产操作系统应用的现状分析、…...

ISFP型人格的优势和劣势分析(mbti性格测试)
isfp型人格的优势分析ISFP在艺术上具有令人惊叹的天分,他们充沛且敏锐的情感能够轻易捕捉到那些细腻的情感变化。他们具有强大的表现力和感染力,能够通过自己的作品,将情感描绘出来并令观众感同身受,这使得他们在艺术和人文领域能…...

电影《断网》观后感
上周看了电影《断网》这部电影,题材是网络攻击与防范的故事,这样的题材距离我们很远,又离我们很近,我们每天都在用网络,生活中也离不开网络,所以它离我们很近,但是真正涉及到网络攻击时…...