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调用方法run
    for(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多线程程序学习就到此为止了,喜欢的小伙伴记得点赞关注,一键三连,你们的支持就是我最大的动力,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 767. Reorganize String(重组字符串)

重新排列字符串s中的字母&#xff0c;使得任意两个相邻的字母都不相同。 思路&#xff1a; 让相邻字母不同&#xff0c;能想到的办法是先把相同的字母排列&#xff0c; 然后在相同字母的缝隙中插入另一种字母。 比如"aab", 先把"a a"排出来&#xff0c;再…

界面组件DevExpress Reporting——增强的SQL和实体框架数据源引入

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 本文总结了v23.1中针对DevExpress报表和BI Das…

UI位置与布局

UI位置与布局 引言 发现UGUI的RectTransform定位还是很复杂的&#xff0c;感觉有必要详细了解一下 RectTransform 继承自Transform。他的local position由其他几个变量控制。建议不要直接设置position 目的是为了实现UI自动布局。这套方法将绝对定位&#xff0c;相对定位&a…

vue和react学哪一个比较有助于以后发展?

前言 首先声明vue和react这两个框架都是很优秀的前端框架&#xff0c;使用的人群下载量上数量也是相当的庞大&#xff0c;这篇文章没有贬低或者攻击任何一个框架的意思&#xff0c;只在于根据答主的问题来对这两个框架做出对比&#xff0c;以方便大家更加清晰的了解到当下vue和…

设计模式--适配器模式(Adapter Pattern)

一、什么是适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式主要用于解决不兼容接口之间的问题&#xff0c;使得原本…

分析系统 - 使用Python爬虫

在竞争激烈的市场环境中&#xff0c;了解和分析竞争对手的销售策略和市场表现对于企业的成功至关重要。本文将介绍如何利用Python爬虫建立低成本的销售竞争对手分析系统&#xff0c;探索其方法、工具和好处&#xff0c;并同时解决可能出现的问题。 销售竞争对手分析的目标是获取…

React基础入门之虚拟Dom

React官方文档&#xff1a;https://react.docschina.org/ 说明 重要提示&#xff1a;本系列文章基础篇总结自尚硅谷课程&#xff0c;且采用类式写法&#xff01;&#xff01;最新的函数式组件写法见高级篇。 本系列文档旨在帮助vue同学更快速的学习react&#xff0c;如果你很…

Android 13 - Media框架(6)- NuPlayer

上一节我们通过 NuPlayerDriver 了解了 NuPlayer 的使用方式&#xff0c;这一节我们一起来学习 NuPlayer 的部分实现细节。 ps&#xff1a;之前用 NuPlayer 播放本地视频很多都无法播放&#xff0c;所以觉得它不太行&#xff0c;这两天重新阅读发现它的功能其实很全面&#xff…

【80天学习完《深入理解计算机系统》】第十天 3.3 条件码寄存器【CF ZF SF OF】【set】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

第四方支付平台和聚合支付有什么区别?

第四方支付平台和聚合支付有什么区别&#xff1f; 聚合支付和第四方支付平台是移动支付领域的两种常见支付方式。它们在实际应用中有许多相似之处&#xff0c;给人们的生活带来了便利。然而&#xff0c;这两种支付方式也有本质的区别。我将从不同的角度对它们进行比较和分析。 …

聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化

聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化 目录 聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化&#xff0c;聚类结果可视化&#xff0c;MATLAB程…

MySQL不停重启问题

MySQL不停的自动杀掉自动重启 看一下log日志 my.cnf 里配置的 log_error /var/log/mysqld.log vim /var/log/mysqld.log 报的错误只是 [ERROR] Cant start server: Bind on TCP/IP port: Address already in use [ERROR] Do you already have another mysqld server …

“分布式”与“集群”初学者的技术总结

一、“分布式”与“集群”的解释&#xff1a; 分布式&#xff1a;把一个囊肿的系统分成无数个单独可运行的功能模块 集群&#xff1a; 把相同的项目复制进行多次部署&#xff08;可以是一台服务器多次部署&#xff0c;例如使用8080部署一个&#xff0c;8081部署一个&#xff0c…

芯科科技宣布推出下一代暨第三代无线开发平台,打造更智能、更高效的物联网

第三代平台中的人工智能/机器学习引擎可将性能提升100倍以上 Simplicity Studio 6软件开发工具包通过新的开发环境将开发人员带向第三代平台 中国&#xff0c;北京 - 2023年8月22日 – 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&…

MathType7MAC中文版数学公式编辑器下载安装教程

如今许多之前需要手写的内容都可以在计算机中完成了。以前我们可以通过word输入一些简单的数学公式&#xff0c;但现在通过数学公式编辑器便可以完成几乎所有数学公式的写作。许多简单的数学公式&#xff0c;我们可以使用输入法一个个找到特殊符号并输入&#xff0c;但是对于高…

6个主流的工业3D管道设计软件

3D 管道设计软件是大多数行业工程工作的主要部分&#xff0c;例如&#xff1a; 电力、石油和天然气、石化、炼油厂、纸浆和造纸、化学品和加工业。 全球各工程公司使用了近 50 种工厂或管道设计软件。 每个软件都有优点和缺点&#xff0c;包括价格点。 EPC 和业主部门当前的趋势…

C语言:指针和数组(看完拿捏指针和数组)

目录 数组名的理解&#xff1a; 一维数组&#xff1a; 解析&#xff1a; 字符数组&#xff1a; 解析&#xff1a; 解析&#xff1a; 字符串数组&#xff1a; 解析&#xff1a; 解析&#xff1a; 一级指针&#xff1a; 解析&#xff1a; 解析&#xff1a; 二维数组&a…

Docker(md版)

Docker 一、Docker二、更换apt源三、docker搭建四、停启管理五、配置加速器5.1、方法一5.2、方法二 六、使用docker运行漏洞靶场1、拉取tomcat8镜像2、拉取成功3、开启服务4、查看kali的IP地址5、访问靶场6、关闭漏洞靶场 七、vulapps靶场搭建 一、Docker Docker是一个开源的应…

pnpm安装包管理工具

pnpm安装包管理工具 pnpm代表performant npm&#xff08;高性能的npm&#xff09;&#xff0c;同npm和Yarn&#xff0c;都属于Javascript包管理安装工具&#xff0c;它较npm和Yarn在性能上得到很大提升&#xff0c;被称为快速的&#xff0c;节省磁盘空间的包管理工具。 pnpm…

数字孪生:重塑制造、医疗和能源等领域的未来

数字孪生技术&#xff0c;作为虚拟仿真的重要领域&#xff0c;正以其强大的能力在各个行业中创造前所未有的创新。本文带大家一起深入探讨数字孪生技术在不同领域的广泛应用场景&#xff0c;展示其在实现效率、可靠性和智能化方面的积极影响。 制造业与工业领域 数字孪生技术在…