JAVA多线程

线程是相当于独立的,在线程中的也是句不变量,除非i将变量定义一在类中或者调用其他类中的方法,来实现公用。

多线程的创建:有两种方案进行创建多线程

Thread对象提供的多线程(无返回值结果void):

main方法默认是一条主线程

创建一个线程类,需要继承Thread类

必须要重写run方法,将要执行的放在run方法中。

不重写的话代表默认执行main方法

之后调用thread对象的start();来执行run方法。

功能较弱。(类是单继承)

在主线程和子线程在进行的时候是不冲突的,可以同时执行。

一般来说系统在进行执行时,是自上而下进行的。

但是在执行时系统对运行内存的分配调度有变化,导致方法体在进行执行的时候不一定谁进行的快,但main方法是主方法。如下图中System线程几是main方法中的线程执行就不一样。

注意事项:

事项一:

启动线程的时候一定还是要start方法才是多线程。

start会调用cpu令其给Thread对象分配内存

若是调用run实际上还是对象的方法。

事项二:需要把子线程放在主线程的执行体之前(即main方法的开头就要执行子线程)

继承Runnable接口实现多线程(无返回值结果void):

这个类是任务类对象。

如果需要执行该进程还是要创建Thread对象将该任务类对象放入Thread中。

使用匿名内部类创建(实际上是上述的简化形式):

先创建Runnable的匿名内部类对象

再交给Thread线程对象封装

再调用封装好的对象的start();方法启动线程

package 匿名内部类;public class test {/*** 实际上只是对Runnable创建的简化*/public static void main(String[] args) {Runnable target =new Runnable() {//实现匿名内部类的对象(匿名内部类创建时可以直接作为参数,即直接放在Thread创建时封装)@Overridepublic void run() {for (int i = 0; i <5 ; i++) {System.out.println("子线程执行中"+i);}}};new Thread(target).start();//使用lambda进行简化
new thread(() ->{fori(int i=0;i<5;i++){System.out.println("子线程输出");}
}
}).start();for (int i = 0; i <5 ; i++) {System.out.println("主线程main执行中"+i);}}
}

实现Callable接口,FutureTask类(线程任务对象),来创建多线程(可以返回执行值结果):

多线程的对象参数可以是自定义类

1.创建任务对象

定义一个Callable接口,重写call方法(线程执行体),封装要做的事情,和要返回的苏剧。

把Callable类型的对象封装称为FutureTask(线程任务对象)。

2.把线程任务对象交给Thread对象。

3.调用Thread对象的start方法启动线程。

4.线程执行完毕后,通过FutureTask(实现了Runnable)对象的get方法去获取线程任务执行的结果。

-------------

在实现Callable时要返回数据需要定义泛型中数据类型

并发,并行,线程的生命周期

前置:

进程:正在运行的程序

并发:

并行:

并发和并行是同时发生的。

线程的生命周期:

Thread提供的方法用于线程的操作

Thread可以直接在线程(包括main)中使用。

Thread是在lang包下的,Java默认导入了lang包

注意线程名字的输出;

重置线程默认的名称时应先设置,在输出

sleep,join方法注释:

sleep主要用于将某个过程在此处暂停多少毫秒。

join时为了确保执行顺序(先执行后执行最后执行....),上图确保按1,2,3进行执行

线程安全引入(出现了问题):

多个线程同时操作一个共享资源的时候,可能会出现业务安全的问题

如当操作统一个资源,且有修改流程

下面进行使用取钱案例来进行实现入门:

两个人操作同一个线程

可能会出现异常

线程同步(解决线程安全):

用来解决线程安全出现的问题

思想:让多个线程先后依次的去访问共享资源。

常见方案一:加悲观锁(指保证线程安全,但不能同时执行,使得性能较差)

先进行上锁,当一个执行完后再执行

锁是可以跨方法用同一个锁的

java的对象锁和类锁在锁的概念上基本上和内置锁是一致的,但是,两个锁实际是有很大的区别的,对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。

this锁的是当前实例对象进入该方法同步锁包括对象锁和 类锁(主要是锁那个静态方法):

类名.class锁用于的是静态方法中的(静态方法用类名可以直接访问)

更多见关键字synchronized的用法。

加锁方式一:同步代码块

锁的是代码块

但此时如果使用的是唯一量,那么线程会较慢,会只能进行一个,所以为了解决此问题应该一张卡一个锁,所以应该使用this使得 在进入的这个所是一个共享资源即对应的是他们一个人同一张卡。

加锁方式二:同步方法

直接锁的是方法将线程,逐个启动该方法

该方式也可以锁静态方法默认是this所以所得是该方法

如果锁了一个方法而另一个方法没锁则另一个方法可以正常都可以进行访问

加锁方式三:Lock锁

Lock锁是一个接口需要使用其下的实例或者多态形式及逆行创建。

锁为确保每个不同的共享资源同一种多个线程同时进行这时也应该要将Lock锁对象在进行创建对象的时候直接赋予该对象

Lock对象即要有锁方法lock也需要有解锁方法unlock

Lock锁的注意事项:

1.在线程进行后,锁后可能会有进入后执行发生bug导致跳出产生”死锁 ”,没有及进行解锁导致其他线程无法使用该方法问题。

所以一般在进行使用的时候需要放在try -catch -finally体系中。

乐观锁(即保证线程安全,又能同时进行,性能较好):

一开始并不进行上锁,当线程出现问题的时候才上锁。

如图再进行是,可能会由于线程执行时,同时++导致数据少加的现象

下面悲观锁:

乐观锁:

乐观锁对不同的数据处理提供了不同的原子类:

如int的原子类:

. incrementAndGet()默认方法是:++(但++是有条件的即上述是否被处理,是通过地址获取数据后比较的)

方法实质是:

CAS算法:拿数据时,判断数据拿出后,与未拿出时数据是否相同(相同表明没有被其他线程处理,相同代表被处理了);如果不相同执行操作,如果相同则作废再拿其他线程处理后数据再进行处理。

线程通信(操作系统,线程的操作处理):

需要了解线程操作类的常用方法

sleep不会释放锁,notifyAll会释放锁。

线程的操作方法。

模型案例:

包子的吃与做,

3个生产者线程,负责生产包子,每个线程每次只能生产1个包子放在桌子上

2个消费者线程负责吃包子,每人每次只能从桌子.上拿1个包子吃。

package 线程通信;
/*** 主要是需要知道Thread提供的操作线程的方法。*/
Thread是在lang包下的。在java环境下可以直接进行使用
public class Threadtest {public static void main(String[] args) {Desk desk = new Desk();//创建3个生产者线程(3个厨师)new Thread(() -> {while (true) {desk.put() ;}}, "厨师1"). start();new Thread(() -> {while (true) {desk. put() ;}}, "厨师2") .start();new Thread(() -> {while (true) {desk. put();}}, "厨师3"). start();//创建2个消费者线程(2个吃货)new Thread(() -> {},"吃货1") . start();new Thread(() -> {},"吃货2") . start();}
}

package 线程通信;
import java.util.ArrayList;
import java.util.List;
public class Desk {List <String> list=new ArrayList<>();public synchronized void put() {try {String name =Thread.currentThread().getName();//判断是否有包子。if(list.size() == 0){list.add(name+"做的肉包子");System.out.println(name + "做了一个肉包子~~");Thread.sleep(2000);//唤醒别人,等待自己this . notifyAll();this. wait();}else {// 有包子了, 不做了。//唤醒别人,等待自己this.notifyAll();this. wait();}} catch (Exception e) {e. printStackTrace();}}//吃货1吃货2public synchronized void get() throws Exception {try {String name = Thread.currentThread().getName();if (list.size() == 1) {//有包子,吃了System.out.println(name + "吃了: " + list.get(0));list.clear();this.notifyAll();this.wait();}else{this.notifyAll();this.wait();}} catch (Exception e) {e. printStackTrace() ;}}}

基本原理:用一定数线程去处理任务

作用:复用线程。

谁代表线程池?

●jDK 5.0起提供了代表线程池的接口: ExecutorService。

最大限度表示最多能储存的线程:最大线程数减去核心(正式员工)线程数,是可创建的临时的线程数。

核心线程和任务队列是相对独立的。

在进行创建线程的时候需要用到threadFactory来进行创建:

线程池处理Runnable任务(无返回值类型):

处理Runnable任务

Runnable是一个无返回值得任务类,只有run方法

需要先创建一个实现Runable的任务类,之后使用线程池的execute方法调用Runnable对象即可

线程池:

创建临时线程的条件:

如果任务队列没满的情况下,则会复用上面的核心线程(等待使用将要完成的线程重新使用)。

当核心线程都被占用且任务队列满了的时候会创建临时线程。

核心线程和任务队列是相对独立的。

当超过的任务队列,所有线程满的时候,会报错。

默认拒绝任务的处理是:会将存在的任务和任务队列中的进行完,但超过任务队列和线程总数的总数的任务,不会添加到任务列表(即不会再进行)

线程池的关闭:

线程池如果没有使用关闭线程的方法,是不会自动关闭的。

需要用close进行。

任务拒绝策略:

上面是常用的,这些是在线程池创建的时候使用的。具体见线程池的创建。

线程池处理Callable任务(可以有返回值类型):

future实质是Futuretask的复写方法。

Callable在调用的时候是可以有设置有返回值类型的

线程池的工具类:

newFixedThreadPool创建时输入的n代表线程数(等于核心线程数==最大线程数)

newsingleThreadExecutor创建时,线程数(等于核心线程数==最大线程数)为1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/213846.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【出现模块node_modules里面包找不到】

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 一、出现的问题二、解决办法三、其它可供参考 一、出现的问题 在本地运行 npm run docs:dev之后&#xff0c;出现 Error [ERR_MODULE_NOT_FOUND]: Cannot find package Z:\Blog\docs\node_modules\htmlparser2\ imported from Z:\Blo…

坚鹏:中国建设银行商业银行场景生态搭建与GBC联动培训

中国建设银行股份有限公司是一家中国领先的大型商业银行&#xff0c;总部设在北京&#xff0c;其前身中国人民建设银行成立于1954年10月。2005年10月在香港联合交易所挂牌上市&#xff0c;2007年9月在上海证券交易所挂牌上市。建设银行为客户提供公司金融业务、个人金融业务、资…

【MATLAB】基于EMD分解的信号去噪算法(基础版)

代码操作 【MATLAB】基于EMD分解的信号去噪算法&#xff08;基础版&#xff09; 代码的主要内容 基于EMD&#xff08;经验模态分解&#xff09;的信号去噪算法通常可以结合相关系数、信号的熵值或者方差贡献率来完成去噪处理。这些指标可以用于确定阈值&#xff0c;从而对信号…

MVC、MVP、MVVM模式的区别

前言&#xff1a;这三个表现层框架设计模式是依次进化而形成MVC—>MVP—>MVVM。在以前传统的开发模式当中即MVC模式&#xff0c;前端人员只负责Model&#xff08;数据库&#xff09;、 View&#xff08;视图&#xff09;和 Controller /Presenter/ViewModel&#xff08;控…

地址栏不安全提示

在使用浏览器时访问网站的时候&#xff0c;我们可能会遇到地址栏提示不安全的情况。这种情况通常都是是由于未安装有效SSL证书或者网站SSL证书过期等原因导致的。本文将介绍如何处理地址栏提示不安全的问题&#xff0c;以确保我们的上网安全。 1&#xff0c;缺少SSL证书&#x…

唱响主旋律——建行江门市分行推动服务实体经济高质量发展

建行江门市分行主动对接当地战略部署&#xff0c;在侨乡热土踏歌而行&#xff0c;全力当好服务实体经济的主力军和维护金融稳定的压舱石&#xff0c;在助力再造一个现代化新江门上贡献建行力量。 输血实体 为实体经济服务是金融的天职。建行江门市分行积极发挥在重大基建领域…

[oeasy]python0002_终端_CLI_GUI_编程环境_游戏_真实_元宇宙

回忆 上次 了解了 python 语言的特点 历史悠久功能强大深受好评已成趋势 3大主流操作系统 macwindowslinux 我们 选择 linux 作为基础系统 为什么选择 黑乎乎的命令行界面呢&#xff1f;&#x1f914; GUI vs CLI 个人电脑 用图标和菜单组成 图形界面(GUI) Graphic User I…

tamcat乱码

学习springmvc时tamcat乱码 ①、启动时tomcat控制台乱码 解决方法是&#xff1a;1、先把idea设置里的默认字节码改成utf-8 ​ 2、把idea显示编码改成utf-8&#xff0c;在末尾加上&#xff08; -Dfile.encodingUTF-8&#xff09; ​ 3、最后重启idea 加上这个 -Dfile.encodingU…

异步回调模式

异步回调 所谓异步回调&#xff0c;本质上就是多线程中线程的通信&#xff0c;如今很多业务系统中&#xff0c;某个业务或者功能调用多个外部接口&#xff0c;通常这种调用就是异步的调用。如何得到这些异步调用的结果自然也就很重要了。 Callable、Future、FutureTask publi…

【EI会议征稿中】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)

第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第二届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2023&…

Shell数组函数:数组——数组和循环(四)

使用数组统计&#xff0c;用户shell的类型和数量 一、脚本编辑 [root192 ~]# vim shell.sh #!/bin/bash declare -A shells while read ii dotypeecho $ii | awk -F: {print $7}let shells[$type] done < /etc/passwdfor i in ${!shells[]} doecho "$i: ${shells[$i]…

SpringSecurity6 | 自定义登录页面

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

SAP UI5 walkthrough step7 JSON Model

这个章节&#xff0c;帮助我们理解MVC架构中的M 我们将会在APP中新增一个输入框&#xff0c;并将输入的值绑定到model&#xff0c;然后将其作为描述&#xff0c;直接显示在输入框的右边 首先修改App.controllers.js webapp/controller/App.controller.js sap.ui.define([&…

JAVA使用POI向doc加入图片

JAVA使用POI向doc加入图片 前言 刚来一个需求需要导出一个word文档&#xff0c;文档内是系统某个界面的各种数据图表&#xff0c;以图片的方式插入后导出。一番查阅资料于是乎着手开始编写简化demo,有关参考poi的文档查阅 Apache POI Word(docx) 入门示例教程 网上大多数是XXX…

电商平台商品销量API接口,30天销量API接口接口超详细接入方案说明

电商平台商品销量API接口的作用主要是帮助开发者获取电商平台上的商品销量信息。通过这个接口&#xff0c;开发者可以在自己的应用或网站中实时获取商品的销量数据&#xff0c;以便进行销售分析、库存管理、市场预测等操作。 具体来说&#xff0c;电商平台商品销量API接口的使…

Unity 下载网络图片的方法,并把图片赋值给UI和物体的方法

Unity 下载网络图片的方法&#xff0c;可使用WWW类或UnityWebRequest类&#xff0c;其中UnityWebRequest是新版的方法。 通常我们下载图片都会转成Texture&#xff0c;然后赋值给UI或者物体。 具体实现方法&#xff1a; using System.Collections; using System.Collections…

3D模型制作木质纹理贴图

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 本文将讲解如何使用GLTF 编辑器 -NSDT 在线材质编辑工具为3D模型设置…

朴素贝叶斯 朴素贝叶斯原理

朴素贝叶斯 朴素贝叶斯原理 判别模型和生成模型 监督学习方法又分生成方法 (Generative approach) 和判别方法 (Discriminative approach)所学到的模型分别称为生成模型 (Generative Model) 和判别模型 (Discriminative Model)。 朴素贝叶斯原理 朴素贝叶斯法是典型的生成学习…

城市生态与交通,数据可视化大屏,PSD源文件(ps大屏设计素材)

用酷炫的大屏展示其城市的生态与交通情况&#xff0c;辅助相关决策。好的大屏组件也可以让设计师的工作更加便捷&#xff0c;使其更高效快速的完成设计任务。现分享城市生态与交通的大屏Photoshop源文件&#xff0c;开箱即用&#xff01;以下为部分截图示意。 若需更多的 智慧…

go sort.Search()

函数 func Search(n int, f func(int) bool) int {} 函数作用 通过二分法查找&#xff0c;找到已经排序好的数组[0,n)中第一个使f为true的索引&#xff0c;如果没有找到返回n 为什么要用二分查找&#xff1f; 因为二分查找相比普通依次遍历而言&#xff0c;速度能有巨幅提升…