--- 多线程编程 基本用法 java ---

随着时代的发展,单核cpu的发展遇到了瓶颈,而要提高算力就要发展多核cpu,他能允许多个程序同时运行,这时并发编程他能利用到多核的优势,于是就成为了时代所趋了

其实多进程编程也能进行实现并发编程,只不过进程太重了,每次创建和销毁所用的资源很大,于是在进程的基础上引入了线程,线程可以理解是轻量级的进程,他创建和销毁的速度更快,调度的速度也更快

对于他俩的区别

进程是系统申请资源的最小单位,线程是系统调度的最小单位

也就说,在申请资源的时候,是按进程来进行分配的,最小也不会小于一个进程需要的最少的数量,而线程是在进程之中的,他们共享进程的资源,并且在实际指令的执行也是通过线程来执行的而不是进程,进程出钱,线程出力,

一个进程中至少有一个进程,也就是主线程,他是程序入口

进程和进程之间是不会共享空间的,而线程和线程之间共享进程的空间

线程的创建

操作系统提供了一些线程的api来我们使用,java又对这些api进行封装到了Thread类中

通过继承thread类来创建线程

重写run方法,线程启动后运行的是run方法中的代码

在创建对象时重写run方法

使用lambda表达式

实现runnable接口来创建线程

线程的启动,需要调用start方法来启动,这样才会这和这个线程分配资源,若是调用run的话,他只是运行这个方法,并不会创建程序

前台线程和后台线程

当所有的前台线程都运行完毕之后,这个进程也就结束了,而这时即使后台线程还在运行也会结束他的运行,前台线程一般是和用户交互的线程,而后台线程不直接参与用户的交互,比如垃圾回收(gc),数据下载

将线程设为后台线程可以使用setDaemon方法

俩个线程都是后台线程,当这里唯一的前台线程main这个主线程运行完之后,就会结束进程,后台线程也会跟着结束

中断一个线程

当线程的入口方法(run)执行完之后,这个线程也就结束了,那么我想要中断这个线程,也就是让他直接return返回,这样run方法也就执行完了,那么如何让程序知道我执行了中断线程的操作呢,这时就可以使用interrupt方法,但线程处于阻塞状态时,调用interrupt方法会是线程抛出InterruptedException这个异常,使用try catch来捕捉这个异常,这样就知道了要中断这个线程

不过要注意的是当这个线程没有处于阻塞状态的话,是不会抛出这个异常的

也可以使用isInterrupted这个方法来判断是否打断

 

变量捕获

在线程中使用外部的局部变量的话会有风险,比如但我创建好了线程,并使用了外部变量a这时我的main函数执行完毕,a变量被销毁了,这时我在线程中还对这个变量进行了更改,那这肯定会出错,使用了一个不存在的变量,于是为了避免这样的事在java中的做法是在线程中拷贝一份这个变量,于是外面的变量是什么状况就和我无关了,然而还有情况,如果在线程中将这个变量更改了,但是外面有没改,这样一边改了,一边又没改,这就又会出错,于是在设计时决定,

在线程中调用外界的局部变量不能够更改,只能使用

等待一个线程 join

线程的调度是随机的,而如果先要的呢给某个线程先执行完了之后才使用另一个线程的话,可以使用join方法,当调用join方法后,可以理解为将run方法插入到调用join那个位置来执行,这时主线程就是在运行run方法

如果把t1的join放到了t2.start的下面的话,那么就不能决定t1 t2执行的先后顺序了,因为这是t2线程也被创建了,他的调度是由内核决定的,而我们的编程是在应用程序上的,并不能决定操作系统内核的事

这里没有给join设置最长等待时间,这就以为这会无限的等待下去知道t1线程执行完毕,这不是很科学,可以给join传参来设值main函数的最大阻塞时间,在这个时间过了之后就会继续向下执行代码

下一篇 线程安全及其解决方案

end~~~

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

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

相关文章

Linux网络_套接字_UDP网络_TCP网络

一.UDP网络 1.socket()创建套接字 #include<sys/socket.h> int socket(int domain, int type, int protocol);domain (地址族): AF_INET网络 AF_UNIX本地 AF_INET&#xff1a;IPv4 地址族&#xff0c;适用于 IPv4 协议。用于网络通信AF_INET6&#xff1a;IPv6 地址族&a…

idea分支合并代码

步骤一 首先把两个分支的代码都提交了&#xff0c;保持和远程仓库一致&#xff0c;不要有任何没提交的代码。如果一些程序的yml配置文件&#xff0c;不想提交&#xff0c;可以复制一个&#xff0c;不受git管理。如果有没有提交的代码&#xff0c;合并分支的时候就会提示那些代…

Java安全—SPEL表达式XXESSTI模板注入JDBCMyBatis注入

前言 之前我们讲过SpringBoot中的MyBatis注入和模板注入的原理&#xff0c;那么今天我们就讲一下利用以及发现。 这里推荐两个专门研究java漏洞的靶场&#xff0c;本次也是根据这两个靶场来分析代码&#xff0c;两个靶场都是差不多的。 https://github.com/bewhale/JavaSec …

docker虚拟机平台未启用问题

在终端中输入如下代码&#xff0c;重启电脑即可 Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform 对于Docker Desktop - Unexpected WSL error问题 参考链接 解决WSL2与docker冲突问题

微服务主流框架和基础设施介绍

概述 微服务架构的落地需要解决服务治理问题&#xff0c;而服务治理依赖良好的底层方案。当前&#xff0c;微服务的底层方案总的来说可以分为两 种&#xff1a;微服务SDK &#xff08;微服务框架&#xff09;和服务网格。 微服务框架运行原理&#xff1a; 应用程序通过接入 SD…

微信小程序集成Vant Weapp移动端开发的框架

什么是Vant Weapp Vant 是一个轻量、可靠的移动端组件库&#xff0c;于 2017 年开源。 目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本&#xff0c;并由社区团队维护 React 版本和支付宝小程序版本。 官网地睛&#xff1a;介绍 - Vant Weapp (vant-ui.gith…

(STM32笔记)十二、DMA的基础知识与用法 第二部分

我用的是正点的STM32F103来进行学习&#xff0c;板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话&#xff0c;用的也是这个板子和教程。 DMA的基础知识与用法 二、DMA传输设置1、数据来源与数据去向外设到存储器存储器到外设存储器到存储器 2、每次传输大小3、传…

C语言 - 可变参数函数 va_list、va_start、va_arg、va_end

目录 一、_INTSIZEOF宏分析 二、可变参数函数介绍 1、va_list 2、va_start 3、va_arg 4、va_end 三、使用介绍 示例1&#xff1a; 示例2&#xff1a; 一、_INTSIZEOF宏分析 #define _INTSIZEOF(n) ((sizeof(n)sizeof(int)-1)&~(sizeof(int) - 1) ) 功能&#x…

【Rust自学】12.2. 读取文件

12.2.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print)&#xff0c;是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步&#xff1a; 接收命令行参数读…

记一次OpenEuler Linux磁盘分区表损坏的数据恢复

问题复现 原本有一台GIS地图服务器存放大量数据&#xff0c;突然有一天磁盘满了&#xff0c;于是运维人员照常进行磁盘扩容。但由于误操作&#xff0c;导致使用fdisk的时候把分区表损坏了&#xff0c;表现如下&#xff1a; 这里可以看到启动时能看到xvda被分为了xvda1和xvda2…

二手车交易系统的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统二手车交易信息管理难度大&#xff0c;容错率低&#xf…

【大模型系列篇】数字人音唇同步模型——腾讯开源MuseTalk

之前有一期我们体验了阿里开源的半身数字人项目EchoMimicV2&#xff0c;感兴趣的小伙伴可跳转至《AI半身数字人开箱体验——开源项目EchoMimicV2》&#xff0c;今天带大家来体验腾讯开源的数字人音唇同步模型MuseTalk。 MuseTalk 是一个实时高品质音频驱动的唇形同步模型&#…

如何禁用 PySpark 在运行时打印信息

我已经开始使用 PySpark。PySpark 的版本是3.5.4&#xff0c;它是通过 进行安装的pip。 这是我的代码&#xff1a; from pyspark.sql import SparkSession pyspark SparkSession.builder.master("local[8]").appName("test").getOrCreate() df pyspark…

HTML拖拽功能(纯html5+JS实现)

1、HTML拖拽--单元行拖动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…

GLM: General Language Model Pretraining with Autoregressive Blank Infilling论文解读

论文地址&#xff1a;https://arxiv.org/abs/2103.10360 参考&#xff1a;https://zhuanlan.zhihu.com/p/532851481 GLM混合了自注意力和masked注意力&#xff0c;而且使用了2D位置编码。第一维的含义是在PartA中的位置&#xff0c;如5 5 5。第二维的含义是在Span内部的位置&a…

华为数通HCIE备考经验分享

在分享我的考试心得前我先介绍一下我自己&#xff0c;我叫郑同学&#xff0c;22岁&#xff0c;就读于深圳信息职业技术学院移动通信技术专业&#xff0c;在2024年的9月&#xff0c;我成功获得了HCIE-Datacom证书。 考证契机 我的备考之旅始于去年2023年的华为ICT大赛。在这场…

Web开发(二)CSS3基础与进阶

Web开发&#xff08;二&#xff09;CSS3基础与进阶 写在前面 参考黑马程序员前端Web教程做的笔记&#xff0c;主要是想后面自己搭建网页玩。 这部分是前端HTML5CSS3移动web视频教程的CSS3基础与进阶部分&#xff0c;包括CSS3的选择器、文字控制属性、背景属性、显示模式等CS…

使用PWM生成模式驱动BLDC三相无刷直流电机

引言 在 TI 的无刷直流 (BLDC) DRV8x 产品系列使用的栅极驱动器应用中&#xff0c;通常使用一些控制模式来切换MOSFET 开关的输出栅极。这些控制模式包括&#xff1a;1x、3x、6x 和独立脉宽调制 (PWM) 模式。   不过&#xff0c;DRV8x 产品系列&#xff08;例如 DRV8311&…

mac 安装docker

1、下载docker 进入 /Applications/Docker.app/Contents/MacOS/Docker Desktop.app/Contents/Resources目录 把app.asar 文件备份 将下载的中文包复制进去。修改成一样的名字 [汉化包下载地址](https://github.com/asxez/DockerDesktop-CN)

jupyter notebook练手项目:线性回归——学习时间与成绩的关系

线性回归——学习时间与学习成绩的关系 第1步&#xff1a;导入工具库 pandas——数据分析库&#xff0c;提供了数据结构&#xff08;如DataFrame和Series&#xff09;和数据操作方法&#xff0c;方便对数据集进行读取、清洗、转换等操作。 matplotlib——绘图库&#xff0c;p…