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

Java 多线程基础 线程4种创建方式

目录

      • 什么是进程
      • 什么是多线程
      • 使用多线程的好处
      • 使用多线程的应用场景
      • 单线程与多线程之间的区别
      • 如何理解线程上下文切换
      • 使用多线程真的开启越多越好吗
      • 线程4种创建的方式
        • 1.继承Thread类
        • 2.使用Runnable
        • 3.使用Callable
        • 4.线程池的方式
      • 多线程五种的状态
      • 如何优雅的停止一个线程

什么是进程

进程就是系统中正在运行的一个程序,程序一旦运行就是一个进程,在一个进程中可以开启多个不同的线程执行。

什么是多线程

多线程就是同一进程下开启多条执行路径,同时执行,互不影响

使用多线程的好处

1、提高程序执行效率
2、快速响应给客户端,给用户较好的体验
3、每个线程之间相互不影响

使用多线程的应用场景

1.使用多线程实现异步发送短信
2.使用多线程实现异步的记录日志
3.使用多线程处理一些比较耗时间的业务逻辑

单线程与多线程之间的区别

单线程:串行执行代码,效率不高,且响应较慢,对用户不是太友好
多线程:进程开启多条线路执行代码,每条线程执行不同的任务,每个线程之间相互不影响

如何理解线程上下文切换

对于单核的CPU来说,CPU在同一个时刻只能够运行一个线程,当正在运行的线程切换到另外一个线程时,这个过程我们可以理解为CPU上下文切换。
如果是多核处理器,比如 6核 12线程,也就是在同一个时刻可以开启12个线程同时运行,服务器支持的线程数越高可以减少CPU上下文的切换,从而提高效率。
所以注意:单核的服务器开启了多线程,人为感知好像是多线程,但是真正意义上的底层不是多线程。

使用多线程真的开启越多越好吗

如果项目比较小的情况下可以采用多线程异步实现处理是可以的,但是如果在高并发的情况下频繁的创建线程,同时也会被CPU分配调度,不断的切换,对服务器影响也是比较大,所以建议如果是在高并发的情况下采用MQ异步的形式替代多线程。

线程4种创建的方式

1.继承Thread类
public class Thread1 extends Thread {@Overridepublic void run() {System.out.println("我是子线程:" + Thread.currentThread().getName());}public static void main(String[] args) {System.out.println("我是主线程:" + Thread.currentThread().getName());// 调用start方法启动线程new Thread1().start();}
}
2.使用Runnable
public class Thread2 implements Runnable {public void run() {System.out.println("我是子线程:" + Thread.currentThread().getName());}public static void main(String[] args) {System.out.println("我是主线程:" + Thread.currentThread().getName());new Thread(new Thread2()).start();}
}
3.使用Callable
public class MyCallable implements Callable<String> {public String call() throws Exception {System.out.println(Thread.currentThread().getName() + "正在异步调用接口发送短信");try {Thread.sleep(3000);} catch (Exception e) {}return "短信发送成功";}public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask<String> futureTask = new FutureTask<String>(new MyCallable());Thread thread = new Thread(futureTask);thread.start();String result = futureTask.get();System.out.println(Thread.currentThread().getName() + result);}
}
4.线程池的方式
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new Runnable() {public void run() {System.out.println(Thread.currentThread().getName());}
});

多线程五种的状态

1.当我们新建一个线程的时候,new Thread的时候为新建的状态。
2.当我们调用到start方法的时候,不会立马执行到我们的run方法,当前线程状态为就绪状态,需要等待cpu的切换。
3.当cpu切换能够调用到该线程的时候,当前线程的状态
为运行状态。
4.当我们在线程调用sleep方法的时候,当前线程线程的状态为
阻塞状态,当休眠的时候过了的时候有需要从新等待cpu调度,从就绪状态到运行。
5.当我们线程调用stop方法或者run方法代码执行结束的时候
当前线程的状态为死亡状态。

在这里插入图片描述

如何优雅的停止一个线程

官方不建议直接调用stop方法停止该线程,建议采用 中间件变量值的停止该线程,也可以使用守护线程

public class Thread005 extends Thread {private volatile boolean flag = true;@Overridepublic void run() {    System.out.println(Thread.currentThread().getName());while (flag) {}}public void stopThread() {this.flag = false;}public static void main(String[] args) {Thread005 thread005 = new Thread005();thread005.start();try {Thread.sleep(3000);thread005.stopThread();} catch (Exception e) {}}
}

相关文章:

Java 多线程基础 线程4种创建方式

目录 什么是进程什么是多线程使用多线程的好处使用多线程的应用场景单线程与多线程之间的区别如何理解线程上下文切换使用多线程真的开启越多越好吗线程4种创建的方式1.继承Thread类2.使用Runnable3.使用Callable4.线程池的方式 多线程五种的状态如何优雅的停止一个线程 什么是…...

C++概念相关练习题

目录 一、内存管理 二、运算符重载 三、this指针 四、构造&析构函数 一、内存管理 下面有关c内存分配堆栈说法错误的是( ) A.对于栈来讲&#xff0c;是由编译器自动管理&#xff0c;无需我们手工控制&#xff1b;对于堆来说&#xff0c;释放工作由程序员控制 B. 对…...

区间合并笔记

文章目录 什么是区间合并怎么做区间合并AcWing 803. 区间合并思路解析my - CODEdalao の CODE 什么是区间合并 区间合并是指给定多个区间&#xff0c;让你将重合的区间合并为一个区间 怎么做区间合并 区间合并类问题大多三个办法&#xff1a; 按左端点排序按右端点排序按左右…...

青少年CTF之PHP特性练习(1-5)

青少年CTF-PHP特性练习 文章目录 青少年CTF-PHP特性练习PHP特性01PHP特性02PHP特性03PHP特性04PHP特性05 PHP特性01 看给出的源码&#xff0c;两个变量的值加密后的MD5相同 <?php$s1 "%af%13%76%70%82%a0%a6%58%cb%3e%23%38%c4%c6%db%8b%60%2c%bb%90%68%a0%2d%e9%47…...

《opencv实用探索·七》一文看懂图像卷积运算

1、图像卷积使用场景 图像卷积是图像处理中的一种常用的算法&#xff0c;它是一种基本的滤波技术&#xff0c;通过卷积核&#xff08;也称为滤波器&#xff09;对图像进行操作&#xff0c;使用场景如下&#xff1a; 模糊&#xff08;Blur&#xff09;&#xff1a; 使用加权平…...

RPA机器人如何确保敏感数据的安全性

数据资源作为数字化时代的关键要素&#xff0c;其重要性一直受到高度重视&#xff0c;由此&#xff0c;数据安全也成为企业和个人必须面对的重要问题。随着RPA技术在各个行业的广泛应用&#xff0c;其系统安全性也成了每个企业关注的重中之重。经验丰富的RPA专家可以有效地采取…...

微信号被封了怎么办

13-7 常在河边走&#xff0c;哪有不湿鞋&#xff0c;做为经常用微信做电商客服的&#xff0c;或者经常在微信上和顾客谈钱的&#xff0c;总是会被微信后台重点关注&#xff0c;一不小心就有可能被封号。 如果遇到太倒霉的时候&#xff0c;永久封号了&#xff0c;这个时候微信…...

关于 ls -s 输出文件大小的单位问题的讨论

自己看书正好看到这里&#xff0c;正纳闷呢&#xff0c;上网查了下&#xff0c;发现不是我自己在为这个问题感到困惑。 有个大哥提出一个问题&#xff1a; 问题标题&#xff1a; ls -s的单位到底是什么&#xff1f; man ls -s, --size print the alloca…...

JSON.stringify方法详解 后端接受JSON数据格式

1、方法定义&#xff1a;JSON.stringify(value, replacer, space) 参数说明&#xff1a; value&#xff1a;js对象 replacer&#xff1a;替换对象&#xff0c;可以是一个方法、对象或数组&#xff0c;将value按照替换规则展示。 space&#xff1a;填充参数&#xff0c;可以是数…...

vue请求如何按顺序执行

我们有时候会碰到这种情况&#xff0c;需要连续发送两个请求&#xff0c;第二个请求需要用第一个请求的某个返回值作为参数来作为第二个请求的请求参数。 但是存在一个问题&#xff1a;两个请求都是异步的&#xff0c;他并不按照我们期望的先后顺序来执行。 这时候就需要控制请…...

【java】编译时bug 项目启动前bug合集

文章目录 1. jdk8中 Optional orElseThrow 编译时报错java: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出2. 启动项目时提示 Error running Application: Command line is too long. Shorten command line for Application or also for Spring Boot default configurati…...

Pytorch——多卡GPU训练与单卡GPU训练相互切换

部分深度学习网络默认是多卡并行训练的&#xff0c;由于某些原因&#xff0c;有时需要指定在某单卡上训练&#xff0c;最近遇到一个&#xff0c;这里总结如下。 目录 一、多卡训练1.1 修改配置文件1.2 修改主训练文件1.3 显卡使用情况 二、单卡训练2.1 修改配置文件2.2 显卡使…...

Github项目-CNNResnet9-残差神经网络水果多分类项目

ResNet-论文全文完整翻译注解 - 知乎 你必须要知道CNN模型&#xff1a;ResNet - 知乎 #!/usr/bin/env python # coding: utf-8 #https://github.com/SehajS/cnn-resnet-fruit-classification # # Classifying Fruits from their Images # # This project aims at creating a…...

学习感悟一己之言

学习感悟一己之言 学习上克服困难实际上是克服心理上或认识上的障碍的过程。所谓的理解&#xff0c;就是化陌生为熟悉。看不懂&#xff0c;一方面是因为接触的材料太陌生&#xff0c;即远离你当前的背景知识&#xff1b;另一方面是材料或讲述者的描述刻画不准确或晦涩不当。有了…...

【设计模式-2.3】创建型——原型模式

说明&#xff1a;本文介绍设计模式中&#xff0c;创建型中的原型模式&#xff1b; 飞机大战 创建型设计模式关注于对象的创建&#xff0c;原型模式也不例外。如简单工厂和工厂模式中提到过的飞机大战这个例子&#xff0c;游戏中飞机、坦克对象会创建许许多多的实例&#xff0…...

八大插入算法(有注释)

直接插入排序 //直接插入排序 void InsertSortingDirectly(int* nums,int numsSize){int j0;for(int i1;i<numsSize-1;i){//定义一个中间变量保存当前要插入的值int tempnums[i];//在前面已排好序的序列中&#xff0c;找到合适的位置插入for(ji-1;j>0;j--){if(nums[j]&g…...

【2】基于多设计模式下的同步异步日志系统

6. 相关技术知识补充 6.1 不定参函数 在初学C语⾔的时候&#xff0c;我们都⽤过printf函数进⾏打印。其中printf函数就是⼀个不定参函数&#xff0c;在函数内部可以根据格式化字符串中格式化字符分别获取不同的参数进⾏数据的格式化。 ⽽这种不定参函数在实际的使⽤中也⾮常…...

npm管理发布包-创建与发布

创建与发布 我们可以将自己开发的工具包发布到 npm 服务上&#xff0c;方便自己和其他开发者使用&#xff0c;操作步骤如下 创建文件夹&#xff0c;并创建文件indexjs&#xff0c;在文件中声明函数&#xff0c;使用 module.exports 暴露npm初始化工具包&#xff0c;package.j…...

基于Spring,SpringMVC,MyBatis的校园二手交易网站

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring,SpringMVC,MyBatis的校园二…...

酒店 KPI绩效考核指标及应用

“路遥知马力&#xff0c;日久见人心”&#xff0c;目前国内各类型酒店风起云涌&#xff0c;大有在市场竞争中一比高下之势&#xff0c;各路精英受经济型酒店低投入高回报的市场利益驱动&#xff0c;都分分抢占市场&#xff0c;从而使国内经济型酒店的数量不断增加&#xff0c;…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...