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.对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制 B. 对…...
区间合并笔记
文章目录 什么是区间合并怎么做区间合并AcWing 803. 区间合并思路解析my - CODEdalao の CODE 什么是区间合并 区间合并是指给定多个区间,让你将重合的区间合并为一个区间 怎么做区间合并 区间合并类问题大多三个办法: 按左端点排序按右端点排序按左右…...
青少年CTF之PHP特性练习(1-5)
青少年CTF-PHP特性练习 文章目录 青少年CTF-PHP特性练习PHP特性01PHP特性02PHP特性03PHP特性04PHP特性05 PHP特性01 看给出的源码,两个变量的值加密后的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、图像卷积使用场景 图像卷积是图像处理中的一种常用的算法,它是一种基本的滤波技术,通过卷积核(也称为滤波器)对图像进行操作,使用场景如下: 模糊(Blur): 使用加权平…...
RPA机器人如何确保敏感数据的安全性
数据资源作为数字化时代的关键要素,其重要性一直受到高度重视,由此,数据安全也成为企业和个人必须面对的重要问题。随着RPA技术在各个行业的广泛应用,其系统安全性也成了每个企业关注的重中之重。经验丰富的RPA专家可以有效地采取…...
微信号被封了怎么办
13-7 常在河边走,哪有不湿鞋,做为经常用微信做电商客服的,或者经常在微信上和顾客谈钱的,总是会被微信后台重点关注,一不小心就有可能被封号。 如果遇到太倒霉的时候,永久封号了,这个时候微信…...
关于 ls -s 输出文件大小的单位问题的讨论
自己看书正好看到这里,正纳闷呢,上网查了下,发现不是我自己在为这个问题感到困惑。 有个大哥提出一个问题: 问题标题: ls -s的单位到底是什么? man ls -s, --size print the alloca…...
JSON.stringify方法详解 后端接受JSON数据格式
1、方法定义:JSON.stringify(value, replacer, space) 参数说明: value:js对象 replacer:替换对象,可以是一个方法、对象或数组,将value按照替换规则展示。 space:填充参数,可以是数…...
vue请求如何按顺序执行
我们有时候会碰到这种情况,需要连续发送两个请求,第二个请求需要用第一个请求的某个返回值作为参数来作为第二个请求的请求参数。 但是存在一个问题:两个请求都是异步的,他并不按照我们期望的先后顺序来执行。 这时候就需要控制请…...
【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训练相互切换
部分深度学习网络默认是多卡并行训练的,由于某些原因,有时需要指定在某单卡上训练,最近遇到一个,这里总结如下。 目录 一、多卡训练1.1 修改配置文件1.2 修改主训练文件1.3 显卡使用情况 二、单卡训练2.1 修改配置文件2.2 显卡使…...
Github项目-CNNResnet9-残差神经网络水果多分类项目
ResNet-论文全文完整翻译注解 - 知乎 你必须要知道CNN模型: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…...
学习感悟一己之言
学习感悟一己之言 学习上克服困难实际上是克服心理上或认识上的障碍的过程。所谓的理解,就是化陌生为熟悉。看不懂,一方面是因为接触的材料太陌生,即远离你当前的背景知识;另一方面是材料或讲述者的描述刻画不准确或晦涩不当。有了…...
【设计模式-2.3】创建型——原型模式
说明:本文介绍设计模式中,创建型中的原型模式; 飞机大战 创建型设计模式关注于对象的创建,原型模式也不例外。如简单工厂和工厂模式中提到过的飞机大战这个例子,游戏中飞机、坦克对象会创建许许多多的实例࿰…...
八大插入算法(有注释)
直接插入排序 //直接插入排序 void InsertSortingDirectly(int* nums,int numsSize){int j0;for(int i1;i<numsSize-1;i){//定义一个中间变量保存当前要插入的值int tempnums[i];//在前面已排好序的序列中,找到合适的位置插入for(ji-1;j>0;j--){if(nums[j]&g…...
【2】基于多设计模式下的同步异步日志系统
6. 相关技术知识补充 6.1 不定参函数 在初学C语⾔的时候,我们都⽤过printf函数进⾏打印。其中printf函数就是⼀个不定参函数,在函数内部可以根据格式化字符串中格式化字符分别获取不同的参数进⾏数据的格式化。 ⽽这种不定参函数在实际的使⽤中也⾮常…...
npm管理发布包-创建与发布
创建与发布 我们可以将自己开发的工具包发布到 npm 服务上,方便自己和其他开发者使用,操作步骤如下 创建文件夹,并创建文件indexjs,在文件中声明函数,使用 module.exports 暴露npm初始化工具包,package.j…...
基于Spring,SpringMVC,MyBatis的校园二手交易网站
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring,SpringMVC,MyBatis的校园二…...
酒店 KPI绩效考核指标及应用
“路遥知马力,日久见人心”,目前国内各类型酒店风起云涌,大有在市场竞争中一比高下之势,各路精英受经济型酒店低投入高回报的市场利益驱动,都分分抢占市场,从而使国内经济型酒店的数量不断增加,…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
