多线程使用说明

一、如何创建多线程

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,一经查实,立即删除!

相关文章

作文笔记9 修辞手法

反问 加强XX语气 强调XX情感 难道我不拿充电器你就不能用电脑了吗? 一般里面带有双重否定 设问 引发读者兴趣 我真的爱她吗?爱个屁 对比 给人鲜明形象和强烈感受 XX同学总是主动问老师有什么作业;而YY同学总是被老师提醒写作业。 排比…

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 五、在终端操作示例 一、小…

Linux系统入侵排查(三)

前言 对我处在学生时期的我来说,目前web渗透还是为主,但是还是需要对于蓝队相关的应急响应,等保测评等还是需要有一定的了解的,攻防兼备才能越站越勇嘛,linux入侵排查也能够让我更加熟悉liunx命令,本篇博文紧接上一篇博文开始进行. 为什么要做系统入侵排查 当企业发生黑客入…

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…

20个硬核Python脚本

整理了一个覆盖面比较广泛的Python脚本示例,涉及到机器学习、数据处理、还有算法er可能会遇到自己写后台的一些案例。 另外,每个模块底部提供了对于官网文档,更加方便的查询具体的使用方法。 内容由简到难,如果对你有帮助的话希…

运行时数据区-基础

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

在安卓应用中实现Socket通信:创建服务端和客户端

介绍:本文主要介绍在安卓中使用Socket创建服务端和客户端进行通信,服务端可以管理多个客户端连接,完善的异常处理,接口回调,可以满足大部分需求,更多功能自行拓展… 关于Socket套接字: 是网络上…

linux开发笔记(F1C200S)折腾weston桌面

参考文章: 1、嵌入式桌面(1)——weston桌面_qt weston-CSDN博客 2、https://blog.51cto.com/u_16213414/9171009 3、weston.ini: configuration file for Weston — the reference Wayland compositor | weston File Formats | Man Pages …

文献速递:深度学习医学影像心脏疾病检测与诊断--基于深度学习的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…

基于C++函数基础中的形参与实参

在C中,函数的形参(形式参数)是在函数定义时声明的参数,而实参(实际参数)是在函数调用时传递给函数的值或变量。 形参的作用是定义函数在执行时所需要的输入,它们在函数体内被当做局部变量使用。…

[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的包来运行

Linux系统执行apt update报错 暂时不能解析域名“xxxx.xxx.com”

一、错误重现 错误:1 http://mirrors.aliyun.com/ubuntu jammy InRelease 暂时不能解析域名“mirrors.aliyun.com” 错误:2 http://mirrors.aliyun.com/ubuntu jammy-updates InRelease 暂时不能解析域名“mirrors.aliyun.com” 错误:3 http://mirrors.aliyun.com/ubuntu j…