多线程---创建及方法

*线程创建的方式:

1.继承Thread类,重写run方法。

2.实现Runnable接口,重写run方法。

实际这两个run方法都重写的是Runnable中的run方法

简化方法:

1.匿名内部类创建Thread 子类对象

Thread thread = new Thread(){@Overridepublic void run() {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("hello Thread...");}}};

模板:

Thread thread = new Thread()

run(   )

};

2.匿名内部类创建Runnable子类,实现Runnable接口,并重写run方法

Thread thread1 = new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("hello Runnable...");}}});

模板:

Thread thread1 = new Thread(new Runnable() {
           run()
        }
);

3.lambda表达式创建

Thread thread2 = new Thread(() -> {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("hello lambda...");}});

模板:

Thread thread2 = new Thread(() -> {
           语句
        }
);

*多线程的实现

假如有一个任务,分别让一个人单独完成,和二个人同时完成。显然是二个人较快。

多线程也是如此。

例如:

public static void main(String[] args) {Thread thread1 = new Thread(() -> {while (true) {System.out.println("工作任务-5...");}});Thread thread2 = new Thread(() -> {while (true) {System.out.println("工作任务-5...");}});//多线程thread1.start();thread2.start();}

当任务较大时,多线程可以节省将近一半时间。

当任务较少时,不建议使用多线程,这会造成系统资源浪费。 

* 线程类及其常见方法

1.常见构造方法 

在后台查看线程时,如果每个线程都有自己的名字,那么出错时就会很快找到。

Thread()创建线程对象

Thread(Runnable  target)使用Runnable对象创建线程

Thread(String name)创建线程对象,并命名

Thread(Runnable  target , String name)使用Runnable对象创建线程,并命名

public class Thread_name {public static void main(String[] args) {Thread thread4 = new Thread(() ->{while (true) {System.out.println("我有名字:" + Thread.currentThread().getName());}},"Thread");thread4.start();}
}

注:  Thread.currentThread()用于线程内调用线程对象

2. Thread的几个常见属性

属性获取方法
IDgetId()
名称getName()
状态getState()
优先级getPriority()
是否后台线程isDaemon()
是否存活isAlive()
是否被中断isInterrupted()
• ID 是线程的唯⼀标识,不同线程不会重复
这个ID是JVM默认为Thread对象生成的编号,属于Java层面,要和PCB区分开,PCB是操作系统层面的
名称 是各种调试⼯具⽤到
状态 表⽰线程当前所处的⼀个情况
也是JAVA层面的

我们看一看有哪些状态: 

NEW:表示创建好了一个Java线程对象,安排好了任务,处于准备就绪状态。

但是还没有启动没有调用start()方法之前是不会创建PCB的,和PCB没有任何关系


RUNNABLE:正在运行+准备就绪状态,最常见的状态

有系统PCB


BLOCKED:等待锁的状态,阻塞的一种。(因为 锁竞争 引起的阻塞)


WAITING :没有等待时间,一直死等,直到被唤醒。


TIMED_WAITING:指定了等待时间的阻塞状态,过时不侯


TERMINATED:结束,完成状态,PCB已经销毁,但是JAVA线程对象还在

线程已经结束,Thread对象还存在

• 优先级 ⾼的线程理论上来说更容易被调度到
字面意思
关于 后台线程 ,需要记住⼀点:JVM会在⼀个进程的所有⾮后台线程结束后(即前台线程),才会结束运⾏。

 创建线程时默认是前台线程
前台线程可以阻止进程的退出
后台线程不阻止进程的退出

设置成后台线程之后,main方法执行完成之后整个程序就退出了,子线程也就自动结束了
如果是前台线程子线程不会受main方法的影响会一直运行下去 

是否 存活 ,即简单的理解,为 run ⽅法是否运⾏结束了
描述的是PCB的状态,可以查看run()方法是否执行完成
public static void main(String[] args) {Thread thread = new Thread(() -> {System.out.println("我的名字:" + Thread.currentThread().getName());});System.out.println(thread.getName() + "Id:" + thread.getId());System.out.println(thread.getName() + "状态:" + thread.getState());System.out.println(thread.getName() + "优先级:" + thread.getPriority());System.out.println(thread.getName() + "后台线程:" + thread.isDaemon());System.out.println(thread.getName() + "活着:" + thread.isAlive());System.out.println(thread.getName() + "被中断:" + thread.isInterrupted());thread.start();//执行后System.out.println(thread.getName() + "后台线程:" + thread.isDaemon());System.out.println(thread.getName() + "活着:" + thread.isAlive());System.out.println(thread.getName() + "被中断:" + thread.isInterrupted());}

3.启动一个线程start()

在没有启动线程之前,复写run()方法是发布要执行的任务,创建线程实例是把做任务的人叫了过来,到还没真正开始做任务,只有调用start()方法,这个“线程"才会去执行任务。

4.终止一个线程

1.使用interrupt ()方法,终止一个线程

    public static void main(String[] args) {Thread th = new Thread(() -> {while(true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("我在执行...");}});th.start();try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("快终止线程!!");th.interrupt();}

如果程序正常执行他在打印五个执行之后就会被终止但是实际运行却报了异常。

这是因为线程终止时,中止的是sleep方法

这个时候我们就需要在sleep方法中进行逻辑处理,使其达到目标,也就是终止程序

 2.自定义一个标志位用于通知线程中断

 

lambda里面如果使用局部变量
触发“变量捕获
需要把这个变量定义为全部的 

全局静态变量 

5.等待一个线程join

 有时候我们需要等待一个线程结束后才开始另一个线程,例如:准备好原材料后才能开始制作产品。这时我们就需要join()方法

方法说明
public void join()等待线程结束
public void join(long millis)等待线程结束,最多等millis毫秒
public void join(long millis, int nanos)同理,但精度更高

 6.获取当前线程的引用

方法说明
public static Thread currentThread()获取当前对象的引用

 使用在Thread内部,调用自身

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

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

相关文章

365天深度学习训练营-第P7周:马铃薯病害识别(VGG-16复现)

文为「365天深度学习训练营」内部文章 参考本文所写记录性文章,请在文章开头带上「👉声明」 🍺 要求: 自己搭建VGG-16网络框架【达成√】调用官方的VGG-16网络框架【达成√】如何查看模型的参数量以及相关指标【达成√】 &#…

【联表查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

诗集鉴赏别有韵味——单例模式与工厂模式的浪漫邂逅

原文节选,出自两汉乐府诗集的《陌上桑》 日出东南隅,照我秦氏楼。秦氏有好女,自名为罗敷。罗敷喜蚕桑,采桑城南隅。青丝为笼系,桂枝为笼钩。头上倭堕髻,耳中明月珠。缃绮为下裙,紫绮为上襦。行者…

重学SpringBoot3-RestTemplate配置与使用详解

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-RestTemplate配置与使用详解 1. 简介2. 环境要求3. 基础配置3.1 添加依赖3.2 RestTemplate配置类 4. 高级配置4.1 自定义连接池配置4.2 错误处理配置 5.…

基于YOLO模型的目标检测与识别实现在ESP32-S3 EYE上全流程部署

前言 文章首发于 基于YOLO模型的目标检测与识别实现在ESP32-S3 EYE上全流程部署 文章目录 前言项目环境安装ESP-IDF安装开发环境运行环境 训练数据集准备添加自定义数据集 下载预训练模型训练 YOLO 模型模型量化和格式转换模型结果评估训练损失评估指标模型推理 模型部署部署环…

Vue中使用ECharts图表中的阈值标记(附源码)

在数据处理和可视化领域,我们经常需要对一系列数据点进行分析。本文将介绍如何在给定的数据点中找到对应于特定Y值的X值,并设置标线起始点标记在ECharts图表中,效果图如下: 实现步骤 1、数据准备 let seriesData [// 提供日期…

如何将 Docker 镜像打包为 ZIP 文件便于分享和转发

在开发和部署中,我们常常需要将 Docker 镜像转发给其他团队成员或部署到不同的环境。如果无法直接访问镜像仓库(如 Docker Hub 或私有镜像仓库),可以选择将镜像保存为文件,并通过 ZIP 格式打包后进行分享。 本文将介绍…

岩体力学的材质-力学等属性的自动划分.

#背景: 在力学求解过程中,我们往往会对目标物体进行网格划分, 那么如何做到自动完成这个过程呢? 这里使用岩体力学中的地下岩层进行举例,这里只是简单的导入了4种界面, 复杂的可以一次性导入几十种界面,都可以计算(你能分多细,这个计算方式就可以帮你分层多细) 这里我只是导…

C++打造局域网聊天室第一课:编程环境及准备知识

文章目录 前言一、使用环境二、基础知识1.MFC(Microsoft Foundation Class)2.API(Application Programming Interface)3.Unicode编码4.简单的比较5.WinSock6.多线程知识 总结 前言 C打造局域网聊天室第一课:编程环境及…

项目-02-数学学院后台项目开发过程中的问题总结

目录 一、后台(pc端,vue2)1. dialog对话框被黑色蒙层盖住2. 将前端表格导出为word文档3. 在线查看、下载 .docx、.doc、.pdf文档 一、后台(pc端,vue2) 1. dialog对话框被黑色蒙层盖住 问题: d…

分类预测 | Matlab实现SO-LSSVM蛇群算法优化最小二乘支持向量机多特征分类预测

分类预测 | Matlab实现SO-LSSVM蛇群算法优化最小二乘支持向量机多特征分类预测 目录 分类预测 | Matlab实现SO-LSSVM蛇群算法优化最小二乘支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现Matlab实现SO-LSSVM蛇群算法优化最小二乘支…

两个畸变矩阵相乘后还是一个2*2的矩阵,有四个畸变元素。1、畸变矩阵吸收了法拉第矩阵。2、畸变矩阵也给法拉第旋转角带来模糊(求解有多种可能)

角度一;恢复畸变的时候也把法拉第旋转恢复了 角度二:求解法拉第旋转角的时候 前面乘的复系数的不同也会带来法拉第旋转角和畸变的不同解 注意:无论多少个畸变矩阵相乘,结果都是2*2的矩阵,也就是畸变参数可以减少…

C# WinForm —— 39 40 41 42 DataGridView 介绍与使用

1. 简介 以网格的形式来显示表格数据,一般与数据库交互,将数据库中某一个表格的数据绑定到 UI控件上 并显示出来 网格中的行和列由用户自定义 三个重要对象:行、列、单元格 2. 属性 属性解释(Name)控件ID,在代码里引用的时候…

前端常用缓存技术深度剖析

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

gradle下载慢解决方案2024 /12 /1android studio (Windows环境)

gradle下载慢解决方案2024 /12 /1 默认环境配置好了,环境配置和程序安装请出门右转 打开软件,点击右上角设置,找到如下设置页 选择本地安装并制定好你已经安装好的 gradle 应用保存即可 全局插件环境配置(新版本可以直接在设置中添加了) 找对应位置添加国内源并把前面的内置源…

后端返回前端的数据量过大解决方案

后端返回前端的数据量过大解决方案 性能面板(Performance) chrome调试指南 原因 遇到一个页面有好几个表格,部分表格采用虚拟滚动条 数据量有点大 接近快60s了,看一下是哪里导致的慢 后台请求方法执行并不慢 2024-12-04 15:21:52.889 INFO 69948 …

在服务器上实现本地python文件的依赖

1、在python中,一个python文件就可以视为一个模块进行导入 2、使用import 导入时,若使用pip 下载过可以直接导入 3、假如是自己写的同项目中的文件会去sys.path 中查找 比如说 我现在 test 下有一个 python文件 运行 下面的代码 打印的数据如上图所示p…

Python酷库之旅-第三方库Pandas(255)

目录 一、用法精讲 1206、pandas.tseries.offsets.SemiMonthEnd.is_on_offset方法 1206-1、语法 1206-2、参数 1206-3、功能 1206-4、返回值 1206-5、说明 1206-6、用法 1206-6-1、数据准备 1206-6-2、代码示例 1206-6-3、结果输出 1207、pandas.tseries.offsets.S…

大数据新视界 -- Hive 元数据管理:核心元数据的深度解析(上)(27 / 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【网络安全】网站常见安全漏洞 - 网站基本组成及漏洞定义

文章目录 引言1. 一个网站的基本构成2. 一些我们经常听到的安全事件3. 网站攻击者及其意图3.1 网站攻击者的类型3.2 攻击者的意图 4. 漏洞的分类4.1 按来源分类4.2 按危害分类4.3 常见漏洞与OWASP Top 10 引言 在当今的数字化时代,安全问题已成为技术领域不可忽视的…