初识Java多线程编程
文章目录
- 一、线程的状态
- 二、线程的常见属性
- 三、多线程编程
- Thread类常用构造方法
- 1.继承Thread类
- 2.实现Runnable接口
- 3.匿名内部类实现
- 4.lambda 表达式创建 Runnable 子类对象
- 四、线程的常见方法
一、线程的状态
//线程的状态是一个枚举类型 Thread.State
public class ThreadState {public static void main(String[] args) {for (Thread.State state : Thread.State.values()) {System.out.println(state);}}
}
- NEW: 安排了工作, 还未开始行动
- RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作.
- BLOCKED: 这几个都表示排队等着其他事情
- WAITING: 这几个都表示排队等着其他事情
- TIMED_WAITING: 这几个都表示排队等着其他事情
- TERMINATED: 工作完成了.
二、线程的常见属性
| 属性 | 获取方法 |
|---|---|
| ID | getId() |
| 名称 | getName() |
| 状态 | getState() |
| 优先级 | getPriority() |
| 是否后台线程 | isDaemon() |
| 是否存活 | isAlive() |
| 是否被中断 | isInterrupted() |
三、多线程编程
常见的多线程实现的方法有不下七种,我们这里介绍继承Thread类以及实现Runnable接口实现,我们接下来逐一介绍
Thread类常用构造方法
- Thread() // 创建线程对象
- Thread(Runnable target) //使用 Runnable 对象创建线程对象
- Thread(String name) //创建线程对象,并命名
1.继承Thread类
首先我们要清楚在Java代码中main方法可以认为是主线程
//通过继承Thread类来实现一个线程类
class MyThread extends Thread {private int sum = 0;public MyThread (int sum){this.sum = sum;}@Overridepublic void run() {while(true){System.out.println("hello Thread"+sum);}}
}public class Text1 {public static void main(String[] args) {//实例化线程类对象MyThread t1 = new MyThread(1);//通过start来启动t线程,自动执行重写的run方法t1.start();//实例化线程类对象MyThread t2 = new MyThread(2);//通过start来启动t线程,自动执行重写的run方法t2.start();}
}
线程之间是并发执行的,因此我们打印的结果时而为2,时而为1,如下图:

2.实现Runnable接口
//实现 Runnable 接口
class MyRunnable implements Runnable{private int sum = 0;public MyRunnable (int sum){this.sum = sum;}@Overridepublic void run() {while(true){System.out.println("hello Thread"+sum);}}
}public class Text2 {public static void main(String[] args) {//创建 Thread 类实例, 调用 Thread 的构造方法时将 Runnable 对象作为 target 参数Thread t1 = new Thread(new MyRunnable(1));Thread t2 = new Thread(new MyRunnable(2));//调用t线程t1.start();t2.start();}
}
3.匿名内部类实现
// 使用匿名类创建 Thread 子类对象
public class Text3 {public static void main(String[] args) {Thread t1 = new Thread(){@Overridepublic void run() {while(true){System.out.println("hello t1");}}};Thread t2 = new Thread(){@Overridepublic void run() {while(true){System.out.println("hello t2");}}};t1.start();t2.start();}
}
- 匿名内部类创建 Runnable 子类对象也是类似
4.lambda 表达式创建 Runnable 子类对象
//利用lambda表达式
public class Text4 {public static void main(String[] args) {Thread t1 = new Thread(()->{while(true){System.out.println("Thread t1");}});Thread t2 = new Thread(()->{while(true){System.out.println("Thread t2");}});t1.start();t2.start();}
}
注:我们在日常生活中最常用的就是以lambda表达式实现的多线程编程
四、线程的常见方法
常见方法大概有:
- 启动线程:start()
- 等待线程:join()
- 获取线程引用:currentThread()
- 休眠线程:sleep(long millis)
- 线程中断: interrupt()、共享标记
简要说明:
1.调用start方法会直接运行我们创建的线程对象重写\实现的run方法
2.调用join方法的时候,会把该线程对象的优先级提高,先将该线程执行结束才会进行执行另一个线程
3.join方法可以带参数(long millis),意在表明只等待该线程一定时间,时间到优先级恢复,与其他线程同时执行
4.sleep方法目的是让线程暂停一定的时间再继续执行
5.线程中断我们后续会详细介绍,以及以上方法的进一步使用也会在后续详细介绍
相关文章:
初识Java多线程编程
文章目录 一、线程的状态二、线程的常见属性三、多线程编程Thread类常用构造方法1.继承Thread类2.实现Runnable接口3.匿名内部类实现4.lambda 表达式创建 Runnable 子类对象 四、线程的常见方法 一、线程的状态 //线程的状态是一个枚举类型 Thread.State public class ThreadS…...
最新入河排污口设置论证、水质影响预测与模拟、污水处理工艺分析及典型建设项目入河排污口方案报告书实例分析
随着水资源开发利用量不断增大,全国废污水排放量与日俱增,部分河段已远远超出水域纳污能力。近年来,部分沿岸入河排污口设置不合理,超标排污、未经同意私设排污口等问题逐步显现,已威胁到供水安全、水环境安全和水生态安全&#x…...
awk指令的详细指南
目录 工作原理 命令格式 awk常见的内建变量(可直接用)如下所示 按行输出文本 按字段输出文本 通过管道、双引号调用 Shell 命令 示例 CPU使用率 数组 编辑统计文件的内容出现的次数 使用awk 统计secure 访问日志中每个客户端IP的出现次数? …...
解密Netty中的Reactor模式
文章目录 单线程Reactor模式多线程Reactor模式Reactor模式中IO事件的处理流程Netty中的通道ChannelNetty中的反应器ReactorNetty中的处理器HandlerNetty中的通道Channel和处理器Handler的协作组件Pipeline Reactor(反应器)模式是高性能网络编程在设计和架构方面的基础模式.Doug…...
这是一个黑科技:C++爬虫~(文末报名C/C++领域新星计划)
目录 写在前面 完整代码 这里必看!! 写在最后 写在前面 现在所有人都知道万能的Python可以做机器学习,可以做人工智能,可以爬取各种小网站,但是你不知道,基于C++的正则表达式早就能够爬取各种网络数据啦!!你没猜错,阿玥将在这篇文章中简介怎么用C...
2023 年第八届数维杯数学建模挑战赛 赛题浅析
为了更好地让大家本次数维杯比赛选题,我将对本次比赛的题目进行简要浅析。本次比赛的选题中,研究生、本科组请从A、B题中任选一个 完成答卷,专科组请从B、C题中任选一个完成答卷。这也暗示了本次比赛的难度为A>B>C 选题人数初步估计也…...
Spring Boot单元测试
什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证的过程就叫单元测试。 单元测试是开发人员编写的一小段代码,用于检验被测代码的一个很小的、很明确的(代码) 功能是否正确。执行单元测试就是为了证明某…...
实景三维浪潮翻涌,新技术“席卷”石家庄!
5月11日,“全自主、全流程、全覆盖”2023实景三维新技术研讨会石家庄站暨航测与遥感学术交流会在石家庄凯旋金悦大酒店圆满举行。 本次会议由中国测绘学会、中国地理信息产业协会指导,河北省测绘学会、河北省地理信息产业协会主办,武汉大势智…...
【Python】使用小脚本
本文整理了我在学习和工作中用到的实用python脚本,希望也能帮助到需要的小伙伴~ 文章目录 视频格式转换顺序遍历文件夹中的文件 视频格式转换 安装视频处理库moviepy pip install moviepy安装FFmpeg(FFmpeg是一个开源的多媒体框架,moviepy…...
技术日志2023-5-18
1、Java远程调试 可参考:https://kefeng.wang/2018/03/06/idea-remote-debug/ 2、用户中心这样的基础项目有什么用,感觉非常鸡肋。 今天开发讨论中涉及到了用户中心,感觉在项目中使用用户中心只是给业务系统发一个token,业务系…...
JUC之锁
公平锁、非公平锁 公平锁指的是多线程按照申请锁的顺序来获取锁; 非公平锁指的是多线程不按照申请锁的顺序来获取锁。可能会出现优先级反转(后者居上) 公平锁为了保证线程申请顺序,势必要付出一定的性能代价,因此其吞…...
C++中的 cout 和 printf 用法
文章目录 前言cout & printfexampleprintf输出string字符串总结 前言 C是一种面向对象的编程语言,它继承了C语言的特点,同时也增加了许多新的特性。在C中的cout 和 printf是两种常用的输出函数,它们都可以将数据显示在屏幕上,…...
Maven基础使用
Maven 学习目标 理解Maven的用途掌握Maven的基本操作掌握Maven如何创建Web项目 Maven是什么 面临问题 在学习Maven之前,我们先来看一下我们现在做的项目都有哪些问题。假设你现在做了一个crm的系统,项目中肯定要用到一些jar包,比如说myb…...
【C++ 入坑指南】(06)运算符
文章目录 一、算术运算符二、赋值运算符三、比较运算符四、逻辑运算符五、算法题5.1、拆分位数 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符,并提供了以下类型的运算符: 运算符类型作用算术运算符用于处理四则运算赋值…...
了解一下js中的函数式编程
js中的函数式编程是一种编程范式,它将函数作为一等公民来使用。 在函数式编程中,函数是一种特殊的对象,可以赋值给变量、作为参数传递给其他函数、或作为其他函数的返回值。 函数式编程强调了函数的纯函数性,即函数输入相同时&a…...
动态HTTP代理在linux里的使用
动态HTTP代理是一种可以自动切换代理IP地址的代理方式,可以有效地绕过一些限制访问的网站。在Linux系统中,可以使用Privoxy和Proxychains来实现动态HTTP代理。 以下是在Linux中使用动态HTTP代理的步骤: 1. 安装Privoxy和Proxychains 在终端中…...
软考证书值得考吗?怎么考?
软考证书是什么?有什么用处?必须先明确这两个问题,才能有复习和考取的动力。怎么考过?这是第二步要着重解决的问题。今天详细帮助大家分析一下。 软考是国家级考试,具有强大的权威性与公信力。 软考全称为计算机技术…...
超级秘密文件夹忘记密码的解决办法
超级秘密文件夹是一款非常特殊的文件夹加密软件,它来无影去无踪,在安装后不会留下任何痕迹,只能通过软件热键才能打开。那么如果在使用过程中忘记了密码,这时我们该怎么办呢?下面我们就来了解一下。 首先,我…...
脑的物理系统
⼤脑模块化 人脑是一个复杂的网络,一般将大脑划分为不同的区域(即节点),并使用某种方法表征大脑区域之间的关系(即连接的边)来构建人脑网络。在功能磁共振成像(fMRI)数据的网络模型…...
1054. 距离相等的条形码(leetcode,堆问题,priority_queue)-------------------c++实现
1054. 距离相等的条形码(leetcode,堆问题,priority_queue)-------------------c实现 题目表述 在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码,使其中任意两个相…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
