当前位置: 首页 > news >正文

Java—实现多线程程序 | 入门

 

目录

一、前言

二、基本概念

进程

 线程

三、Java多线程实现

java.lang.Thread类

获取线程名字及对象

获取main进程名

Thread currentThread()

四、线程优先级 

设置优先级 


一、前言

前期入门学习的代码中,全部都是单线的程序,也就是从头到尾地运行

在我们平时使用手机电脑的应用程序时,它们几乎都是多线程地工作

例如idea,typora等等。本文就从现在开始,一步步尝试写多线程程序代码,一起来学习吧!


二、基本概念

进程

任何的软件存储在磁盘中,运行软件的时候,OS使用IO技术,将磁盘中的软件的文件加载到内存,程序在能运行。

这里的内存大小就是电脑内存条的大小,也就是平时所说的运行内存大小,常见的有4G,8G,16G,32G甚至更高。

 应用程序运行的时候进入到内存,程序在内存中占用的内存空间就叫进程

 线程

在内存和CPU之间,建立一条连接通路,CPU可以到内存中取出数据进行计算,这个连接的通路,就是线程

 一个进程(内存资源)可以开启多个线程,也就是多条通路。

  • 并发: 同一个时刻多个线程同时操作了同一个数据
  • 并行: 同一个时刻多个线程同时执行不同的程序

 拓展一个知识,CPU(中央处理器)现在我们都会看到多少核心多少线程,对操作系统而言,一个核心同一时刻只能运行一个进程/线程,所以多核多线程CPU可以极大提升效率

 


三、Java多线程实现

java.lang.Thread类

Java万物是对象,所以线程也是对象,Thread类是线程对象的描述类

实现线程程序可以分为几个步骤:

  1. 定义一个类来继承thread类
  2. 子类重写方法run
  3. 创建子类对象
  4. 调用子类对象的start()方法启动线程

 我们用一个简单的例子来演示一下,运行一下for语句

//定义一个类来继承thread类
//子类重写方法run
public class SubThread extends Thread {public void run(){for(int x = 0 ; x < 50 ;x++)System.out.println("run---"+x);}
}
public static void main(String[] args) {SubThread subThread = new SubThread();    //创建线程程序subThread.start();            //调用子类对象的方法start()启动线程//启动线程,JVM调用方法runfor(int x = 0 ; x < 50 ;x++)System.out.println("main---"+x);
}

我们运行一下,不难看到两个for此时是分开工作,且符合线程的随机性(是个渣男),喜欢哪个,就运行哪个,所以你会发现,每次运行输出的结果都会不一样,无规律性

获取线程名字及对象

 既然我们成功运行了程序,那就进一步了解线程的相关知识。

线程也是有名字的,默认为thread-0,thread-1,thread-2,以此类推

要查看线程的名字,我们可以用thread类的方法getName()返回线程的名字,返回值是String类型

因为继承的是父类thread,要用其方法,也得使用super

public class ThreadName extends Thread {public void run (){System.out.println("线程名字:: "+ super.getName());}
}

当我们想修改线程名时,就可以使用setName()方法

   public static void main(String[] args) {ThreadName threadName = new ThreadName();//threadName.setName("线程1");threadName.start();ThreadName threadName1 = new ThreadName();//threadName1.setName("线程2");threadName1.start();}

获取main进程名

前言说道,入门写过的代码,都是单线程,那这个单线程的main进程名该怎么获取,首先我们可以尝试一下让这个类继承一下thread类

当然,因为是静态static

 public static void main(String[] args){}

所以我们不能直接调用thread的getName()方法,这时我们可以使用另一个方法返回一个线程对象,然后用这个对象来调用getName()方法

Thread currentThread()

  • 静态调用,作用是返回当前的线程对象

  • "当前" , 指的是调用这个方法的线程

我们在上面的main中调用,就可以返回当前(main)的 对象

Thread thread =  Thread.currentThread();
System.out.println("name::"+thread.getName());

 运行结果显示,它的线程名就为:main

 同理,也可以用此方法获取其他继承thread类的子类的线程名,代替getName()


四、线程优先级 

 所有的线程优先级都是默认的,所以会产生刚开始我们设置两个线程进行for循环,输出结果无规律的现象。默认值为5,最低为1,最高为10

设置优先级 

这次使用到的方法如下: 

setPriority()

 创建好对象后,我们调用setPriority()方法即可。

 理论上 优先级高的线程,占用CPU时间相对较长一些

t1.setPriority(MAX_PRIORITY);    //优先级最高
t0.setPriority(MIN_PRIORITY);    //优先级最低

今天的Java多线程程序学习就到此为止了,喜欢的小伙伴记得点赞关注,一键三连,你们的支持就是我最大的动力,谢谢!

相关文章:

Java—实现多线程程序 | 入门

目录 一、前言 二、基本概念 进程 线程 三、Java多线程实现 java.lang.Thread类 获取线程名字及对象 获取main进程名 Thread currentThread() 四、线程优先级 设置优先级 一、前言 前期入门学习的代码中&#xff0c;全部都是单线的程序&#xff0c;也就是从头到尾…...

8.5 【C语言】指向函数的指针

8.5.1 什么是函数的指针 每次调用函数时都从该地址入口开始执行此段函数代码。函数名代表函数的起始地址。 8.5.2 用函数指针变量调用函数 例8.22 用函数求整数a和b中的大者 解题思路&#xff1a;在主函数调用max函数&#xff0c;除了可以通过函数名调用外&#xff0c;还可…...

C++实现字符串的逆置

目录 C和C的区别 【1】C对C的扩充 【2】C对C的兼容 第一个C程序 【1】hello world 【2】cout标准输出流对象 i&#xff09;介绍 ii&#xff09;运算 iii&#xff09;cout的使用 iv&#xff09;使用cout指定格式的输出 练习&#xff1a;1、输出斐波那契的前10项。 【3】…...

论Spring或Spring Boot的花式扩展

文章目录 引言扩展点讲述花式扩展之自动配置类花式扩展之实现接口实现方式样例 花式扩展之自定义starterImport方式SpringFactories方式 总结鸣谢 引言 Spring Boot是一个高度可定制的框架&#xff0c;旨在帮助开发者快速创建、配置和管理他们的应用程序 扩展点讲述 Spring Bo…...

如何评估分类模型的好坏

如何评估分类模型的好坏 评估分类预测模型的质量&#xff0c;常用一个矩阵、三条曲线和六个指标。 一个矩阵&#xff1a;混淆矩阵&#xff1b;三条曲线&#xff1a;ROC曲线、PR曲线、KS曲线&#xff1b;六个指标&#xff1a;正确率Acc、查全率R、查准率P、F值、AUC、BEP值、KS…...

● 84.柱状图中最大的矩形

84.柱状图中最大的矩形 class Solution { public:int largestRectangleArea(vector<int>& heights) {stack<int>st;heights.insert(heights.begin(),0);heights.push_back(0);st.push(0);int res0;for(int i1;i<heights.size();i){while(heights[i]<heig…...

未检查的转换: ‘java.lang.Object‘ 转换为 ‘java.util.List

fastjson方式 Object object ... // 获取待转换的objectList<WbsCategory> list JSON.parseObject(JSON.toJSONString(object), new TypeReference<List<WbsCategory>>() {}); 在这个示例中&#xff0c;我们使用JSON.toJSONString()将object对象转换…...

【C语言】使用C语言,实现九九乘法表(另附Python、Java、JavaScript实现方式)

文章目录 1. C语言实现1.1 思路1.2 代码实现 3.其他语言实现3.1 Python实现3.2 Java实现3.3 JavaScript实现 1. C语言实现 1.1 思路 九九乘法表图示&#xff1a; 思路如下&#xff1a;定义两层for循环即可实现九九乘法表 一共有9层&#xff0c;所以要定义一个变量i&#xff…...

[机缘参悟-102] :IT人 - 管理的本质?管理人与从事技术的本质区别?人性、冰山模型、需求层次模型

感悟&#xff1a; 管理的本质是&#xff1a;学习各种管理理论、方法、技能&#xff0c;克服自身的人性缺点、预防他人人性的恶点、利用他人的人性特点拿到结果&#xff0c;从而完成组织、管理者的上司、管理者自身、管理者下属的目标。管理中的问题&#xff0c;80%以上都人性问…...

[论文阅读笔记26]Tracking Everything Everywhere All at Once

论文地址: 论文 代码地址: 代码 这是一篇效果极好的像素级跟踪的文章, 发表在ICCV2023, 可以非常好的应对遮挡等情形, 其根本的方法在于将2D点投影到一个伪3D(quasi-3D)空间, 然后再映射回去, 就可以在其他帧中得到稳定跟踪. 这篇文章的方法不是很好理解, 代码也刚开源, 做一…...

【Java 动态数据统计图】前后端对接数据格式(Map返回数组格式数据)六(120)

说明&#xff1a; 前端使用&#xff1a;vue3.0 前后端对接数据格式&#xff1a;无非就是前端把后端返回的数据处理为自己想要的格式&#xff0c;或者&#xff0c;后端给前端处理好想要的格式&#xff1b; 针对前后端的柱状图&#xff0c;趋势图等数据对接&#xff0c;前端一般需…...

❤ 给自己的mac系统上安装java环境

❤ 给自己的mac系统上安装java环境 &#x1f353; 作为前端工程师如何给自己的mac系统上安装java环境 &#x1f34e; 最近因为自己的一些项目需求&#xff0c;mac电脑上需要安装一些后台的java环境&#xff0c;用来跑后台的java程序&#xff0c;于是从一个前端工程师的角度安…...

Java-匿名类

介绍 匿名类是指没有名字的类&#xff0c;它对一个给定的类进行拓展&#xff0c;或者实现一个给定的接口。使用匿名类可以使得代码更加简洁、紧凑、模块程度更高。 实现方式及语法 匿名类有两种实现方式 继承一个类&#xff0c;重写其方法实现一个接口&#xff08;可以是多…...

Maven的超级POM

对于我们创建的一个maven工程&#xff0c;即便我们自己的pom.xm文件中没有明确指定一个父工程&#xff08;父POM&#xff09;&#xff0c;其实也默认继承了超级POM&#xff0c;就好比JAVA类继承Object类一样。 maven官网关于超级POM的介绍&#xff1a; https://maven.apache.o…...

软考高级系统架构设计师系列论文九十二:论新技术的引进

软考高级系统架构设计师系列论文九十二:论新技术的引进 一、摘要二、正文三、总结一、摘要 根据国家税务总局对税务系统内所有系统进行集成与整合的需求,我所在的开发单位组织了全国金税工程防伪税控系统网络版的升级开发工作。该项目工程浩大,要求在具有严格的安全、可靠性…...

vue使用Bootstrap的详细方法

要在Vue中使用Bootstrap&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装Bootstrap&#xff1a;首先&#xff0c;您需要安装Bootstrap。您可以使用npm或者yarn来安装Bootstrap。打开终端&#xff0c;并在项目的根目录中运行以下命令&#xff1a; npm install bootst…...

leetcode做题笔记103. 二叉树的锯齿形层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 思路一&#xff1a;BFS #define N 2000int** zigzagLevelOrder(st…...

如果将PC电脑变成web服务器:利用Nignx反向代理绕过运营商对80端口封锁

如果将PC电脑变成web服务器&#xff1a;利用Nignx反向代理绕过运营商对80端口封锁 在上一篇文章中&#xff0c;我们已经实现了内网主机的多次端口映射&#xff0c;将内网主机的端口映射到了公网&#xff0c;可以通过公网访问该主机了。 因为电信的家庭宽带&#xff0c;默认是…...

Eureka:服务注册-信息配置-自我保护机制

首先在提供者服务下&#xff0c;添加一个依赖 <!-- Eureka --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId><version>1.4.6.RELEASE</version><…...

C++二叉树进阶

本期内容我们讲解二叉树的进阶知识&#xff0c;没有看过之前内容的小伙伴建议先看往期内容 二叉树-----补充_KLZUQ的博客-CSDN博客 目录 二叉搜索树 代码实现 基础框架 Insert Find Erase 析构函数 拷贝构造 赋值 二叉搜索树的应用 全部代码 二叉搜索树 二叉搜索树…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...