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

7.Java高级编程 多线程

Java高级编程 多线程

文章目录

  • Java高级编程 多线程
  • 一、进程与线程
      • 查看线程
  • 二、线程创建方式
  • 三、线程状态
  • 四、线程常用方法
  • 五、线程安全

一、进程与线程

一个程序有一个进程

一个进程包含多个线程(必须有一个主线程)

并发:

在同一时刻,有多个指令在单个CPU上交替执行

并行:

在同一时刻,有多个指令在多个CPU上同时执行

查看线程

Thread t = Thread.currentThread();//获得当前线程

二、线程创建方式

1.继承Thread类,重写run方法,调用start方法

2.实现Runnable接口,重写run方法,创建Thread对象new Thread(Runnable),调用start

3.实现Callable<数据类型>,重写call方法 **注意:**Callable有返回值

package com.hz.ch01;public class MyThread extends Thread{public void run() {//书写线程要执行的代码for(int i = 0; i<100; i++) {System.out.println(getName()+"whfoawh");}}
}package com.hz.ch01;public class Text {public static void main(String[] args) {/** 多线程的第一种启动方式:* 		1.自己定义一个类继承Thread* 		2.重写run方法* 		3.创建子类的对象,并启动线程*/MyThread t1 = new MyThread();MyThread t2 = new MyThread();//开启线程t1.setName("线程1");t2.setName("线程2");t1.start();t2.start();}}
package com.hz.ch02;public class MyRun implements Runnable{@Overridepublic void run() {//书写线程要执行的代码for(int i = 0;i < 100;i++) {//获取当前线程对象Thread t = Thread.currentThread();System.out.println(t.getName()+"HelloWorld");}}}package com.hz.ch02;public class Text01 {public static void main(String[] args) {/** 多线程的第二种启动方式:* 		1.自己定义一个类实现Runnable接口* 		2.重写里面的run方法* 		3.创建自己的类的对象* 		4.创建一个Thread类的对象,并开启线程* *///创建MyRun的对象//表示多线程要执行的任务MyRun mr = new MyRun();//创建线程对象Thread t1 = new Thread(mr);Thread t2 = new Thread(mr);//给线程设置名字t1.setName("线程1");t2.setName("线程2");//开启线程t1.start();t2.start();}}
package com.hz.ch03;import java.util.concurrent.Callable;public class MyCallable implements Callable<Integer>{@Overridepublic Integer call() throws Exception {//求1-100之间的和int sum = 0;for(int i = 1;i<=100;i++) {sum = sum+i;}return sum;}
}package com.hz.ch03;import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class Text01 {public static void main(String[] args) throws InterruptedException, ExecutionException {/** 多线程的第三种运行结果* 特点:可以获取到多线程运行的结果* * 1,创建一个类MyCallable实现Callable接口* 2.重写call(是有返回值的,表示多线程运行的结果)* 3.创建MyCallable的对象(表示多线程要执行的任物)* 4.创建FutureTask的对象(作用管理多线程运行的结果)* 5.创建Three类的对象,并启动(表示线程)* * *///创建MyCallable的对象(表示多线程要执行的任物)MyCallable mc = new MyCallable();//创建FutureTask的对象(作用管理多线程运行的结果)FutureTask<Integer> ft = new FutureTask<>(mc);//创建线程的对象Thread t1 = new Thread(ft);//启动线程t1.start();//获取多线程运行的结果Integer resule = ft.get();System.out.println(resule);}}

三、线程状态

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建状态:new Thread

就绪状态:调用start()方法

运行状态:执行run()方法

阻塞状态:调用sleep,join会进入阻塞状态,恢复后改为就绪状态->运行

死亡状态:run()运行结束

四、线程常用方法

说 明
void setPriority(int newPriority)更改线程的优先级
static void sleep(long millis)在指定的毫秒数内让当前正在执行的线程休眠
void join()等待该线程终止
static void yield()暂停当前正在执行的线程对象,并执行其他线程
void interrupt()中断线程
boolean isAlive()测试线程是否处于活动状态

wait() 暂停一个线程

notilfy 唤起一个线程

注意:join写在哪个线程阻塞谁,谁调用谁强制执行

sleep使用毫秒 1000毫秒=1秒

使用synchronized修饰的方法控制对类成员变量的访问

访问修饰符 synchronized 返回类型 方法名(参数列表){……}

synchronized 访问修饰符 返回类型 方法名(参数列表){……}

synchronized就是为当前的线程声明一把锁

/*** 多人抢票线程* @author 26255**/
public class Writ1 implements Runnable{public Integer votes = 10;public Integer num = 0;@Overridepublic void run() {while(true) {synchronized (this) {if(votes<=0) {break;}votes--;num++;System.out.println(Thread.currentThread().getName()+"抢到了第几"+num+"张票,剩余"+votes+"张票");}//模拟网络延时try {Thread.sleep(500);} catch (Exception e) {e.printStackTrace();}}}}-------------------------------------------------------------------------------public static void main(String[] args) {Writ1 writ = new Writ1();Thread b1 = new Thread(writ,"票口一");Thread b2 = new Thread(writ,"票口二");Thread b3 = new Thread(writ,"票口三");b1.start();b2.start();b3.start();}

五、线程安全

线程安全的类型

** **方法是否同步效率比较适合场景
线程安全多线程并发共享资源
非线程安全单线程

为达到安全性和效率的平衡,可以根据实际场景来选择合适的类型

线程安全的类型

查看ArrayList类的add()方法定义

ArrayList类的add()方法为非同步方法

当多个线程向同一个ArrayList对象添加数据时,可能出现数据不一致问题

ArrayList为非线程安全的类型

Hashtable &&HashMap

​ Hashtable

​ 继承关系

​ 实现了Map接口,Hashtable继承Dictionary类

​ 线程安全,效率较低

键和值都不允许为null

​ HashMap

​ 继承关系实现了Map接口,继承AbstractMap类

​ 非线程安全,效率较高

​ 键和值都允许为null

StringBuffer && StringBuilder

前者线程安全,后者非线程安全
当多个线程向同一个ArrayList对象添加数据时,可能出现数据不一致问题

ArrayList为非线程安全的类型

Hashtable &&HashMap

​ Hashtable

​ 继承关系

​ 实现了Map接口,Hashtable继承Dictionary类

​ 线程安全,效率较低

键和值都不允许为null

​ HashMap

​ 继承关系实现了Map接口,继承AbstractMap类

​ 非线程安全,效率较高

​ 键和值都允许为null

StringBuffer && StringBuilder

前者线程安全,后者非线程安全

相关文章:

7.Java高级编程 多线程

Java高级编程 多线程 文章目录 Java高级编程 多线程一、进程与线程查看线程 二、线程创建方式三、线程状态四、线程常用方法五、线程安全 一、进程与线程 一个程序有一个进程 一个进程包含多个线程&#xff08;必须有一个主线程&#xff09; 并发&#xff1a; 在同一时刻&a…...

MT8370|MTK8370(Genio 510 )安卓核心板参数介绍

MTK Genio 510 (MT8370)安卓核心板是一款极为先进的高性能平台&#xff0c;专为满足边缘处理、先进多媒体功能及全面的连接需求而设计&#xff0c;适用于多种人工智能(AI)和物联网(IoT)应用场景。它具备多个高分辨率摄像头支持和可联网触摸屏显示&#xff0c;适用于使用多任务高…...

动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目

一、介绍 动物识别系统。本项目以Python作为主要编程语言&#xff0c;并基于TensorFlow搭建ResNet50卷积神经网络算法模型&#xff0c;通过收集4种常见的动物图像数据集&#xff08;猫、狗、鸡、马&#xff09;然后进行模型训练&#xff0c;得到一个识别精度较高的模型文件&am…...

【STL】priority_queue 基础,应用与操作

c在C的标准模板库&#xff08;STL&#xff09;中&#xff0c;priority_queue 是一个基于堆的容器适配器&#xff0c;用于实现优先级队列。它本质上是一个最大堆&#xff08;Max-Heap&#xff09;&#xff0c;即每次取出元素时&#xff0c;始终取出优先级最高的元素。本文将详细…...

tasklist命令的应用实例

tasklist命令的应用实例 引言 在系统管理和故障排查过程中&#xff0c;了解当前正在运行的进程信息是至关重要的。Windows操作系统提供了一个强大的命令行工具——tasklist&#xff0c;它可以帮助用户查看当前系统中所有正在运行的进程及其相关信息。掌握这个命令的使用&…...

基于协同过滤算法+PHP的新闻推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤算法PHPMySQL的新…...

196页满分PPT | 集团流程优化及IT规划项目案例

细阐述了XX集团信息化建设的总体目标、指导原则、信息架构规划、应用系统架构规划、IT基础设施架构规划以及IT管控模式设计。文档内容涵盖了从现状分析到未来三年信息化建设目标的明确&#xff0c;以及如何通过IT系统支持集团的战略升级。 背景痛点 总体信息架构规划 总体信息架…...

Android 使用高德地图实现道格拉斯 - 普克算法

道格拉斯 - 普克算法&#xff08;Douglas-Peucker algorithm&#xff09;是一种用于曲线简化的算法。 一、算法的作用 该算法的主要目的是在保持曲线形状特征的前提下&#xff0c;通过减少数据点的数量来简化曲线。这在地图绘制、图形处理、地理信息系统等领域有广泛的应用。例…...

OpenAI GPT o1技术报告阅读(2)- 关于模型安全性的测试案例

✨报告阅读&#xff1a;使用大模型来学习推理(Reason) 首先是原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 接下来我们看一个简单的关于模型安全性的测试&#xff0c;当模型被问到一个有风险的话题时&#xff0c;会如何思考并回答用户呢&…...

Stream流的思想和获取Stream流

首先介绍流的概念&#xff1a; 流可以理解为一条流水线&#xff0c;在这条流水线中有许多操作&#xff0c;比如筛选所需要的数据&#xff0c;输出打印等&#xff0c; 经过这条流水线&#xff0c;可以获取到自己所需要的数据&#xff1a; -->所以&#xff1a; Stream流的作…...

go语言中的切片详解

1.概念 在Go语言中&#xff0c;切片&#xff08;Slice&#xff09;是一种基于数组的更高级的数据结构&#xff0c;它提供了一种灵活、动态的方式来处理序列数据。切片在Go中非常常用&#xff0c;因为它们可以动态地增长和缩小&#xff0c;这使得它们比固定大小的数组更加灵活。…...

ElK 8 收集 Nginx 日志

1. 说明 elk 版本&#xff1a;8.15.0 2. 启个 nginx 有 nginx 可以直接使用。我这里是在之前环境下 docker-compose.yml 中启动了个 nginx&#xff1a; nginx:restart: alwaysimage: nginx:1.26.1ports:- "80:80"- "443:443"volumes:#- ./nginx/html:/…...

Xv6驱动(四):CLINT

阅读材料 Xv6代码&#xff1a;memlayout.h、start.c、kernelvec.S教材5.4节 CLINT内存映射 实际上&#xff0c;CLINT还包括若干个MSIP寄存器&#xff0c;用来触发软件中断&#xff0c;但是在Xv6中不考虑软件中断&#xff0c;因此这些寄存器也不用考虑 // core local interr…...

【LInux】HTTPS是如何实现安全传输的

1. 客户端发起HTTPS连接请求 当浏览器请求一个HTTPS网址时&#xff0c;客户端&#xff08;例如浏览器&#xff09;会向服务器发起一个HTTPS请求。 2. 服务器返回数字证书 服务器收到请求后&#xff0c;会向客户端发送包含公钥的数字证书。数字证书由**权威认证机构&#xff…...

英飞凌PSoC4000T的GPIO中断示例工程

关于PSoC4000T的初步介绍见:英飞凌MCU第五代高性能CAPSENSE技术PSoC4000T_psoc 4000t-CSDN博客 下面这个工程,在modustoolbox中可编译、下载到开发板、debug调试。 编译时会用到mtb_shared这个库: 已经pdl这个periperal driver library库:...

物联网(IoT)中基于深度学习的入侵检测系统的综合综述

这篇论文是一篇全面的综述&#xff0c;标题为“A comprehensive survey on deep learning-based intrusion detection systems in Internet of Things (IoT)”&#xff0c;作者是Qasem Abu Al-Haija和Ayat Droos。论文主要探讨了在物联网(IoT)环境中基于深度学习的入侵检测系统…...

《成都体育学院学报》

投稿指南 成都体育学院学报属于体育类型期刊&#xff0c;由成都体育学院主办&#xff0c;国内统一刊号&#xff1a;51-1097/G8&#xff0c;国际标准刊号&#xff1a;1001-9154&#xff0c;双月&#xff0c;面向国内外公开发行。 一、来稿必须是作者独立取得的原创性学术研究成…...

Flask-JWT-Extended登录验证, 不用自定义

"""安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外&#xff0c;你还可以指定其他的选项&#xff0c;例如&#xff1a;过期时间 (max_age)&#xff1…...

rpm 与 yum

11 rpm -qa | grep openssh rpm与 yum CentOS仅删除软件包本身而不删除依赖 https://blog.csdn.net/kangshuaibi/article/details/125472204...

几种修改docker默认存储位置的方法

需求 docker容器存放目录磁盘空间满了&#xff0c;需要转移数据&#xff0c;修改Docker默认存储位置 解决方法 方法&#xff11;&#xff1a;迁移到新目录 停止docker服务。 1systemctl stop docker; //每个liunx版本的命令不一样。创建新的docker目录&#xff0c;执行命令df…...

小说下载器终极指南:一站式解决100+网站小说保存难题

小说下载器终极指南&#xff1a;一站式解决100网站小说保存难题 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 在数字阅读时代&#xff0c;你是否曾因小说突然下架、网站404或网络中…...

DMA-330地址空间限制与扩展方案解析

1. DMA-330地址空间限制解析DMA-330作为Arm CoreLink系列中的直接内存访问控制器&#xff0c;其物理寻址能力直接由AxADDR信号宽度决定。这个32位地址总线宽度意味着它原生仅支持4GB&#xff08;2^32字节&#xff09;的物理地址空间访问。在实际嵌入式系统设计中&#xff0c;这…...

【UniApp小程序开发】解决无法使用Vue自定义指令的完美替代方案:权限组件封装

在 UniApp 开发中&#xff0c;你是否遇到过这样的困惑&#xff1a;明明在 Vue Web 项目中用得顺手的 v-permission 自定义指令&#xff0c;一到小程序端就完全失效&#xff1f;本文将深入剖析其原因&#xff0c;并提供一套可直接复用的组件化解决方案&#xff0c;让你在小程序中…...

【深度解析】AI Coding 模型竞速:从 Claude Mythos 安全编码到 GPT-5.6 传闻,如何落地代码审查智能体

摘要 AI 编码模型正在从“代码补全”进入“复杂代码库理解、漏洞发现与自动修复”阶段。本文结合 Claude Mythos、Claude Opus 4.8 与 GPT-5.6 相关信息&#xff0c;解析新一代 Coding Agent 的技术趋势&#xff0c;并给出基于大模型 API 的代码安全审查实战方案。背景介绍&…...

CUDA并行计算与FSR框架优化实践

1. CUDA并行计算与FSR框架概述在GPU加速计算领域&#xff0c;CUDA&#xff08;Compute Unified Device Architecture&#xff09;作为NVIDIA推出的并行计算平台和编程模型&#xff0c;已经成为高性能计算的事实标准。其核心设计理念是将计算任务分解为网格&#xff08;Grid&…...

通过用量看板分析团队大模型API消耗发现优化调用策略的机会

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过用量看板分析团队大模型API消耗发现优化调用策略的机会 作为团队的技术负责人&#xff0c;确保大模型API调用在满足业务需求的…...

脉冲神经网络加速器设计与边缘计算优化

1. 脉冲神经网络加速器的设计挑战与突破在边缘计算领域&#xff0c;脉冲神经网络(SNN)正以其独特的生物启发特性引发新一轮技术变革。与传统人工神经网络(ANN)相比&#xff0c;SNN通过离散的脉冲信号传递信息&#xff0c;模拟生物神经元的工作机制&#xff0c;理论上可实现超低…...

圈复杂度>12=技术债炸弹?DeepSeek静态分析实战:从17.8→3.2的重构路径全披露

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;圈复杂度&#xff1e;12技术债炸弹&#xff1f;DeepSeek静态分析实战&#xff1a;从17.8→3.2的重构路径全披露 当函数圈复杂度&#xff08;Cyclomatic Complexity&#xff09;持续高于12&#xff0c;它不再是…...

告别坐标点击!用Poco精准定位UI控件,让你的Airtest安卓自动化脚本更稳定

告别坐标点击&#xff01;用Poco精准定位UI控件&#xff0c;让你的Airtest安卓自动化脚本更稳定每次UI微调就导致脚本大面积失效&#xff1f;分辨率变化让精心编写的自动化测试瞬间崩溃&#xff1f;作为从坐标点击转型到控件识别的实践者&#xff0c;我深刻理解这种挫败感。三年…...

大厂校招变了:AI 能力正在进入笔试和面试

最近不少同学投递校招时&#xff0c;应该已经发现一个变化&#xff1a; 以前 JD 里写的是“熟悉 Python / Java / SQL / Office 优先”。 现在越来越多岗位开始出现新的描述&#xff1a; “熟练使用 AI 工具者优先” “了解大模型应用者优先” “具备 AI 辅助编程经验优先” “…...