多线程使用说明

一、如何创建多线程

1、继承Thread类

如果调用run方法,相当于还是只有一条main线程,会把run的线程当成一条普通对象,如下,t会执行完再往下执行,这样t就不是一个线程类,而是一个普通的对象,所以必须调用start方法,才是启动线程。start方法向cpu注册单独的线程,如果调用run方法就不会注册线程,而是当成普通的对象往下跑。

不要把主线程任务放在子线程之前,因为他会全部跑完子线程前边的代码,才会执行子线程的内容,所以要将主线程的任务放到子线程之后。

2、实现Runnable接口

3、实现Callable接口

二、线程的常用方法

1、为线程设置名字

线程有默认的名字,但是咱不能区分是哪个线程,咱们可以在执行线程中获取线程名字

注意setName一定要在start之前,否则有可能线程执行完了,名字才赋上,所以一定要在start之前setName

给线程赋名字,还有另外一种方式,Thread提供了有参构造器,如下:

2、sleep和join

sleep就是让线程暂停一下,到了时间,线程再继续执行,作用就是让程序跑的慢一点

join作用:让当前调用这个方法的线程先执行完,然后再继续往下执行,如下

调用join方法就会让当前线程执行完

三、线程安全问题

1、模拟取钱案例

出现线程问题了

需要线程同步来解决这个问题

四、线程同步解决线程安全问题

加锁的常见实现方式:

1、同步代码块

这样可以解决线程安全的问题。这个只是同一个账户,如果多个账户同时取钱,就不能用同一个锁名字了,如下:

程序会认为是一个账户,咱们可以用this,线程的共享资源

如果静态方法中加锁,咱们可以使用类名.class,如下:

因为本身静态方法就是通过类名被所有线程进行访问的。

2、同步方法

同步方法默认以this作为锁,只是你看不到而已。

如果是静态方法加上synchronized,默认的是类名.class作为锁。

同步代码块性能更好,都执行到同步代码块才开始等待。

3、Lock锁

为啥要在Account类中创建锁对象呢,因为一个账户就应该有一个锁。下边看一下如何加锁和解锁。

运行没有问题。建议锁对象加上final修饰,说明这个所对象是不允许被人替换的,显得你很专业。

还有一点,咱现在代码很少,感觉没啥问题,如果后期代码很多,可能会出现异常,如果出现异常没有进行解锁的话,其他线程就运行不了了,所以咱们最好将其放在try catch finally中,unlock放在finally中,这样才能保证线程出现异常下次还能执行。

五、线程通信


做好包子之后唤醒别人,等待自己,一定先唤醒别人,不然自己都睡着了,怎么唤醒别人呢

六、线程池

1、认识线程池

每个线程处理完,就复用线程处理下个任务

2、如何创建线程池

常用的实现类是ThreadPoolExecutor

第二个参数一般大于第一个参数,多出来的就是临时线程

3、线程池处理Runnable任务

三个核心线程,下边在执行第四个线程的时候,等前边的线程有执行完的,就执行第四个。

线程池执行完并不会死忙,想要死亡可以点击红点,也可以调用shutdown方法,这个方法会等前边的线程都执行完了才会关掉线程池。还有一个方法是shutdownNow,这个会立即关闭线程池,不管里面的线程是否执行完,这个肯定不是咱们想要的,代码演示如下:

shutdown方法,所有的线程都执行完,才关闭线程池

shutdownNow方法,执行了几个就关闭线程池了,后边的线程就会报错了。

测试下什么时候创建临时线程,这个需要将三个核心线程处于一直忙的状态,咱们加个线程等待的时间,进行测试

三个核心线程一直在忙,下边创建的四个线程是任务队列里面的,下边再创建线程的时候就到了创建临时线程的时间了,如下:

任务什么时候拒绝呢,当核心线程在忙,任务队列也占满了,临时线程在忙,再来新任务就要拒绝了

执行结果如下:

4、线程池处理Callable任务

七、并行、并发

八、线程的生命周期

线程sleep后,并不会释放锁,等待几秒后就自动醒了,继续执行。调用wait方法,会自动释放锁,等待几秒后,如果得到锁就会继续执行。

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

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

相关文章

Python网络编程 03 实验:FTP详解

文章目录 一、小实验FTP程序需求二、项目文件架构三、服务端1、conf/settings.py2、conf/accounts.cgf3、conf/STATUS_CODE.py4、启动文件 bin/ftp_server.py5、core/main.py6、core/server.py 四、客户端1、conf/STATUS_CODE.py2、bin/ftp_client.py 五、在终端操作示例 一、小…

2024华为数通HCIP-datacom最新题库(变题版)

请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了,如果你准备去考试,还是用的之前的题库,切记暂缓。 H1…

本地搭建springboot服务并实现公网远程调试本地接口

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

HTML5 Canvas发光Loading动画源码

源码介绍 之前我们分享过很多基于CSS3的Loading动画效果,相信大家都很喜欢。今天我们要来分享一款基于HTML5 Canvas的发光Loading加载动画特效。Loading旋转图标是在canvas画布上绘制的,整个loading动画是发光3D的视觉效果,HTML5非常强大。 …

8.删除有序数组中的重复项 II

文章目录 题目简介题目解答解法一:双指针(快慢指针)代码:复杂度分析: 题目链接 大家好,我是晓星航。今天为大家带来的是 删除有序数组中的重复项 II 相关的讲解!😀 题目简介 题目解…

学习100个Unity Shader (17) --- 深度纹理

文章目录 效果shader部分C# 部分理解参考 效果 shader部分 Shader "Example/DepthTexture" {SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _CameraDepthTexture;struct a2v{float4 pos : POSITIO…

运行时数据区-基础

运行时数据区-基础 为什么学习运行时数据区Java内存区域(运行时数据区域)和内存模型(JMM) 区别组成部分(jdk1.7 / jdk1.8)从线程隔离性分类与类加载的关系每个区域的功能参考文章 为什么学习运行时数据区 …

文献速递:深度学习医学影像心脏疾病检测与诊断--基于深度学习的PET图像重建与运动估计

Title 题目 Deep Learning Based Joint PET Image Reconstruction and Motion Estimation 基于深度学习的PET图像重建与运动估计 01 文献速递介绍 正电子发射断层扫描(PET)成像是一种非侵入性成像技术,通过使用放射性示踪剂在活体内可视化…

架构师:搭建Spring Security、OAuth2和JWT 的安全认证框架

1、简述 Spring Security 是 Spring 生态系统中的一个强大的安全框架,用于实现身份验证和授权。结合 OAuth2 和 JWT 技术,可以构建一个安全可靠的认证体系,本文将介绍如何在 Spring Boot 中配置并使用这三种技术实现安全认证,并分析它们的优点。 2、Spring Security Spri…

营销H5测试综述

H5页面是营销域最常见的一种运营形式,业务通过H5来提供服务,可以满足用户对于便捷、高效和低成本的需求。H5页面是业务直面用户的端点,其质量保证工作显得尤为重要。各业务的功能实现具有通用性,相应也有共性的测试方法&#xff0…

[1726]java试飞任务规划管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java试飞任务规划管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql…

VS code放大缩小

​ 放大 ctrl和一起按 缩小 ctrl和-一起按 上面是键盘组合方式,如果需要Ctrl滚轮实现代码的缩放,可以这样。 在文件-->首选项-->设置-->用户设置: 在搜索栏输入mouseWheelZoom 选中即可。 ​ 输入 mouseWheelZoom 进行搜素 特…

linux 使用intel oneapi报错报错

使用intel oneapi 2024.1.0 时经常报这个错误 因为当前 intel2024.1.0没有在使用 需要改回2024.0.0并安装适配的torch的包来运行

1688工厂货源API接口:用于商品采集、商品搜索、商品详情数据抓取

item_get 获得1688商品详情item_search 按关键字搜索商品item_search_img 按图搜索1688商品(拍立淘)item_search_suggest 获得搜索词推荐item_fee 获得商品快递费用seller_info 获得店铺详情item_search_shop 获得店铺的所有商品item_password 获得淘口令…

机器学习:基于TF-IDF算法、决策树,使用NLTK库对亚马逊美食评论进行情绪分析

前言 系列专栏:机器学习:高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学…

python实现txt文件内容对比功能

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.演示 四.代码分析 一.前言 内容对比是一种常见的信息分析和研究方法,主要涉及对不同来源、类型或版本的内容进行比

HTTP请求三方接口绕过https证书检查

问题:在http请求https接口过程中经常会遇到SSL证书检查或者证书过期 ** sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed ** 解决办法:绕过证书检查…

[NSSRound#1 Basic]sql_by_sql

[NSSRound#1 Basic]sql_by_sql 这题没啥难的&#xff0c;二次注入盲注的套题 先注册&#xff0c;进去有个修改密码 可能是二次注入 修改密码处源码 <!-- update user set password%s where username%s; -->重新注册一个admin-- 获得admin身份&#xff08;原理看sqli-l…

分享10个高质量宝藏网站~

分享一波高质量宝藏网站~ 这10个宝藏网站&#xff0c;个个都好用到爆&#xff0c;娱乐、办公、学习都能在这里找到&#xff01; 1、Z-Library https://zh.zlibrary-be.se/ 世界最大的免费电子书下载网站&#xff01;电子书资源超千万&#xff0c;不过这个网站不太稳定&#…

MongoDB Atlas Vector Search与Amazon Bedrock集成已全面可用

亮点前瞻 ●MongoDB Atlas Vector Search知识库与Amazon Bedrock的最新集成&#xff0c;将极大加速生成式AI应用的开发。 ●诺和诺德利用MongoDB Atlas Vector Search与Amazon Bedrock集成&#xff0c;加速构建AI应用程序。 MongoDB&#xff08;纳斯达克股票代码&#xff1a…