【Java|多线程与高并发】 使用Thread 类创建线程的5种方法如何查看程序中的线程
文章目录
- 前言
- 线程创建
- 1.继承Thread类重写run()方法
- 如何查看程序中的线程?
- 2.实现Runnable接口
- 3.使用匿名内部类,继承Thread
- 4.使用匿名内部类,实现Runnable
- 5.⭐使用Lambda表达式,创建线程(重要)
- Thread 的常见构造方法
- 总结
前言
在这里主要补充说明一些问题,方便更好地理解下面的内容:
1.关于多线程存在有什么意义以及多线程存在有什么好处?
多线程编程主要是为了更好地解决并发编程这个问题,因为创建销毁调度一个进程开销比较大(消耗资源多和速度慢),进程之所以开销比较大,主要是在"资源的分配和回收上"
而线程也被称为"轻量级进程",因此在解决并发编程这个问题上,线程的创建销毁调度的更快一些.
2.线程和进程的关系
一个进程可以有一个线程,也可以有多个线程,但是不能没有线程
在启动线程时,只有第一个线程的开销比较大,后面的开销就很小了
在不支持线程的操作系统中,进程既是资源分配的基本单位,也是调度的基本单位;在拥有线程的操作系统中,线程是调度的基本单位,而进程是资源分配的基本单位。
系统级线程的切换需要内核的支持,用户级线程的切换不需要内核的支持。同一进程中的线程共享同一物理内存空间。
3.增加线程的数量,能否提高执行速度
增加线程的数量不一定能提高速度,因为CPU核心数是有限的,如果创建线程太多,不小的开销主要在调度上浪费了
4.其它的一些知识点
线程就是独立的执行路径
main()线程也称为主线程,为系统的入口,执行整个程序,由JVM进行创建
程序运行时,即使没有手动创建线程,后台也会有多个线程,如:主线程,gc线程
在一个进程中,线程是抢占式执行,各个线程的执行顺序是不确定的
Java多线程中,最核心的类就是Thread类,而使用Thread类不需要导入任何类型的包,因为它是在java.lang包下,默认是导入的 线程主要是为了更好地解决并发编程的问题
线程创建
线程的创建有5种方法,下面为大家一一介绍这些创建线程的方法
1.继承Thread类重写run()方法
//创建线程 方法1:继承Thread 重写run方法
class MyThread extends Thread{@Overridepublic void run() {while(true){System.out.println("run方法在执行");}}
}
public class ThreadDemo1 {public static void main(String[] args) {Thread thread = new MyThread();thread.start();//这里要注意while(true){System.out.println("main方法在执行");}}
}
代码执行的一小段结果如下:

在创建好thread这个实例对象之后,调用的方法是start方法,而不是run方法,调用start方法是为了创建一个线程,由这个新的线程去调用thread.run方法,在run方法执行完毕后,创建的这个新的线程就自动销毁了,如果直接调用thread方法,是不会有新的线程的
程序执行流程图区别如下:

对于上述代码来说,如果只是调用thread.run()方法,那么程序只会一直打印"run方法在执行",不可能会打印"main()方法在执行"
如何查看程序中的线程?
为了更好地看到线程,Java也为我们提供了方法,我们可以使用jdk中自带的工具jconsole来查看当前进程中的所有线程
在查看线程时要运行你想要查看程序的main方法






如果打开jconsole.exe之后什么都看不到,可以尝试以管理员方式运行
2.实现Runnable接口
实现Runnable接口,要重写的方法也是run()方法
//Runnable 描述一个"要执行的任务"
class MyRunnable implements Runnable{@Overridepublic void run() {System.out.println("hello Thread");}
}
public class TreadDemo2 {public static void main(String[] args) {Runnable runnable = new MyRunnable();//描述了一个任务Thread thread = new Thread(runnable);//把任务交给线程来执行thread.start();}
}
这样的写法最大的好处就是解耦合,目的是为了将任务和线程之间分开
3.使用匿名内部类,继承Thread
public class ThreadDemo3 {public static void main(String[] args) {Thread thread = new Thread(){@Overridepublic void run() {System.out.println("hello thread");}};thread.start();}
}
- 这里new Thread() 是创建了一个Thread的子类,没有名字,所以是匿名,并让thread指向这个子类对象
4.使用匿名内部类,实现Runnable
public class ThreadDemo4 {public static void main(String[] args) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("hello thread");}});//注意()thread.start();}
}
- 这个写法是创建了一个子类,实现了Runnable接口,同时创建了类的实例,并传给Thread的构造方法
5.⭐使用Lambda表达式,创建线程(重要)
这种创建线程的方法最简单,在平时使用的时候,使用Lambda表达式创建线程是最常用的,所以这种线程的创建方式要务必掌握!!!
public class ThreadDemo5 {public static void main(String[] args) {Thread thread = new Thread(()->{System.out.println("hello thread");});thread.start();}
}
Thread 的常见构造方法
Thread 的常见构造方法常见的构造方法有四种
| 构造方法 | 说明 |
|---|---|
| Thread() | 创建线程对象 |
| Thread(Runnable target) | 使用 Runnable 对象创建线程对象 |
| Thread(String name) | 创建线程对象,并命名 |
| Thread(Runnable target, String name) | 使用 Runnable 对象创建线程对象,并命名 |
这里着重说一下第三种和第四种构造方法, 这两种构造方法可以给线程命名.给线程命名的最大好处就是当程序中创建了很多的线程,而程序中地某个线程中出现问题,可以更好地进行调试,更快地找到问题所在.
总结
- 掌握线程创建的方法,特别是用Lambda表达式创建线程的方法(最简单也最常用)
- 掌握start()和run()方法之间的区别

相关文章:
【Java|多线程与高并发】 使用Thread 类创建线程的5种方法如何查看程序中的线程
文章目录前言线程创建1.继承Thread类重写run()方法如何查看程序中的线程?2.实现Runnable接口3.使用匿名内部类,继承Thread4.使用匿名内部类,实现Runnable5.⭐使用Lambda表达式,创建线程(重要)Thread 的常见构造方法总结前言 在这里主要补充说明一些问题,方便更好地理解下面的…...
零基础学MySQL(五)-- 详细讲解数据库中的常用函数
目录🎇一、聚合函数1️⃣count 函数(1)基本语法(2)基本练习(3)注意细节2️⃣sum 函数(1)基本语法(2)基本练习(3)注意细节3…...
第4章 流程控制-if-else,Switch,For循环(循环守卫,循环步长,倒叙打印),While循环,多重循环...
第 4 章 流程控制-if-else,Switch,For循环(循环守卫,循环步长,倒叙打印),While循环,多重循环 4.1 分支控制 if-else 让程序有选择的的执行,分支控制有三种:单分支、双分支、多分支 4.1.1 单分支 1)基本语法…...
2.4G-WiFi连接路由器过程
一、概述 WiFi的数据通信基于802.11协议进行,无线AP在工作时会定时向空中发送beacon数据包,基站(STA)从beacon中解析出AP的名称、加密方式等信息,从而发起连接。 二、WiFi连接路由器的详细过程 WiFi连接过程主要可以…...
3. SpringMVC Rest 风格
1. REST 简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格。 当要表示一个网络资源的时候,可以使用两种方式: 传统风格资源描述形式 http://localhost/user/getById?…...
Python3简介
Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。 Python 是面向对象语言: 这意味着P…...
如何学习PMP?
★基础要打牢 方法:“基础不牢,地动山摇”,如果基础不牢那么就很难拿高分,因为连最基础的题目分都不一定能拿到。 可以在针对基础知识,把PMBOK看一两遍,再次加深印象,再把平时做章节练习、每日5…...
【DSP视频教程】第11期:插补算法,曲线拟合丝滑顺畅,统计函数和基础函数加速实现,汇集SIMD,饱和和MAC乘累加应用实战(2023-02-12)
视频教程汇总帖:https://www.armbbs.cn/forum.php?modviewthread&tid110519 DSP视频教程有段时间没有更新了。 当前DSP库从CMSIS软件包里面独立出来,并且更新非常频繁,所以本期视频教程优先给大家简单介绍下新版DSP, 然后为…...
分类模型评估:混淆矩阵、准确率、召回率、ROC
1. 混淆矩阵 在二分类问题中,混淆矩阵被用来度量模型的准确率。因为在二分类问题中单一样本的预测结果只有Yes or No,即:真或者假两种结果,所以全体样本的经二分类模型处理后,处理结果不外乎四种情况,每种…...
算法 ——世界 一
个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。个人爱好: 编程,打篮球,计算机知识个人名言:海不辞水,故能成其大;山不辞石…...
2023年3月AMA-CDGA/CDGP数据治理认证考试这些城市可以报名
目前2023年3月5日CDGA&CDGP开放报名的城市有:北京、上海、广州、深圳、杭州、重庆,西安,成都,长沙,济南,更多考场正在增加中… DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业…...
Java变量和数据类型,超详细整理,适合新手入门
目录 一、什么是变量? 二、变量 变量值互换 三、基本数据类型 1、八种基本数据类型 2、布尔值 3、字符串 四、从控制台输入 一、什么是变量? 变量是一种存储值的容器,它可以在程序的不同部分之间共享;变量可以存储数字、字…...
Echarts 设置折线图拐点的颜色,边框等样式,hover时改变颜色
第014个点击查看专栏目录上一篇文章我们讲到了如何设置拐点大小,图形类型,旋转角度,缩放同比,位置偏移等,这篇文章介绍如何设置拐点的颜色、边框大小颜色等样式。hover轴线时候,拐点的填充颜色改变文章目录示例效果示例…...
做 SQL 性能优化真是让人干瞪眼
很多大数据计算都是用SQL实现的,跑得慢时就要去优化SQL,但常常碰到让人干瞪眼的情况。 比如,存储过程中有三条大概形如这样的语句执行得很慢: select a,b,sum(x) from T group by a,b where …; select c,d,max(y) from T grou…...
SpringBoot(3)之包结构
根据spring可知道,注解之所以可以使用,是因为通过包扫描器,扫描包,然后才能通过注解开发。 那么springboot需要扫描哪里呢? springboot的默认包扫描器,扫描的是自己所在的包和子包,例子如下 我…...
test2
物理层故障分析 一、传输介质故障 a.主要用途简述 传输介质主要分为 导向传输介质和非导向传输介质。前者包括双绞线(两根铜线并排绞合,距离过远会失真)、同轴电缆(铜质芯线屏蔽层,抗干扰性强,传输距离更…...
LoadRunner安装教程
备注:电脑最好安装有IE浏览器或者360极速版浏览器 一、下载安装包 提前下载安装文件,必须下载。 链接: https://pan.baidu.com/s/1blFiMIJcoE8s3uVhAxdzdA?pwdqhpt 提取码: qhpt 包含的文件有: 二、安装loadrunner 注意,以…...
VHDL语言基础-Testbech
目录 VHDL仿真概述: 基本结构: VHDL一般仿真过程: 仿真测试平台文件: 编写测试平台文件的语言: 一个测试平台文件的基本结构如下: 测试平台文件包含的基本语句: 产生激励信号的方式: 时钟信号: 复位信号: 周期信性信号: 使用延迟DELAYD: 一般的激励信号…...
机器学习基础总结
一,机器学习系统分类 机器学习系统分为三个类别,如下图所示: 二,如何处理数据中的缺失值 可以分为以下 2 种情况: 缺失值较多:直接舍弃该列特征,否则可能会带来较大噪声,从而对结果造成不良影…...
linux的三权分立设计思路和用户创建(安全管理员、系统管理员和审计管理员)
目录 一、三权分立设计思路 1、什么是三权 2、三员及权限的理解 3、三员之三权 4、权限划分 5、“三员”职责 6、“三员”配置要求 二、linux三权分立的用户创建 1、系统管理员 2、安全管理员 3、审计管理员 一、三权分立设计思路 1、什么是三权 三权指的是配置、…...
硬件工程师的‘工具箱’进化史:从万用表到示波器,再到我离不开的5款效率神器
硬件工程师的效率革命:5款改变工作流的现代工具解析 十年前,我的工作台上堆满了各种笨重的测试设备,笔记本里塞满手绘的电路图和潦草的调试记录。如今,当我走进新一代硬件工程师的实验室,发现他们的工作方式已经发生了…...
AI 模型推理引擎性能比较
AI模型推理引擎性能比较:解锁高效计算的秘密 在人工智能技术快速发展的今天,AI模型推理引擎的性能直接决定了实际应用的效率和成本。无论是云端服务还是边缘设备,选择一款高效的推理引擎可以大幅提升响应速度、降低资源消耗。本文将从计算速…...
从PointNet++到SoftGroup:手把手带你复现5个经典3D点云分割算法(附PyTorch代码)
从PointNet到SoftGroup:5大3D点云分割算法实战解析与PyTorch实现指南 1. 3D点云分割技术演进与核心挑战 在三维视觉领域,点云分割技术正经历着从基础架构到复杂系统的革命性演变。不同于传统图像处理,点云数据具有非结构化、稀疏性和无序性三…...
CentOS7下StarRocks 3.1.13集群部署实战:三节点FE高可用配置详解
CentOS7下StarRocks 3.1.13集群部署实战:三节点FE高可用配置详解 在当今数据驱动的商业环境中,企业级分析型数据库的可靠性和性能至关重要。StarRocks作为新一代MPP分析数据库,凭借其卓越的实时分析能力和高并发查询性能,正逐渐成…...
解密SWAT模型中的土壤水分特性:如何用SPAW快速计算AWC与饱和导水率?
土壤水分特性在SWAT模型中的关键作用与SPAW实战指南 土壤水分参数对水文模拟的影响机制 在分布式水文建模领域,土壤水分特性参数犹如隐藏在水循环方程式中的密码钥匙。这些看似简单的数值背后,实则决定着水分在土壤剖面中的运移轨迹、植物根系的吸水效率…...
计算机视觉:从基础到深度学习应用
计算机视觉:从基础到深度学习应用 1. 背景与意义 计算机视觉(Computer Vision,简称CV)是人工智能领域的重要分支,旨在使计算机能够理解和处理图像信息。随着深度学习的发展,计算机视觉取得了突破性进展&…...
3个步骤实现微信消息永久保存,高效保护重要沟通记录
3个步骤实现微信消息永久保存,高效保护重要沟通记录 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.com/…...
Alibaba DASD-4B Thinking 对话工具应用:自动化软件测试用例生成与评审
Alibaba DASD-4B Thinking 对话工具应用:自动化软件测试用例生成与评审 每次新版本上线前,测试团队是不是都忙得焦头烂额?产品需求文档改了又改,测试用例也得跟着一遍遍更新,手动编写不仅耗时,还容易遗漏边…...
Swin Transformer生产部署与性能调优:从环境适配到架构优化的全周期解决方案
Swin Transformer生产部署与性能调优:从环境适配到架构优化的全周期解决方案 【免费下载链接】Swin-Transformer This is an official implementation for "Swin Transformer: Hierarchical Vision Transformer using Shifted Windows". 项目地址: http…...
实测MinerU 2.5-1.2B:复杂排版PDF提取效果惊艳,小白也能上手
实测MinerU 2.5-1.2B:复杂排版PDF提取效果惊艳,小白也能上手 1. 引言:为什么需要专业的PDF提取工具 1.1 日常工作中的PDF处理痛点 作为一名经常需要处理学术文献的研究员,我深知PDF文档带来的困扰。上周我尝试用常规工具提取一…...
