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高级编程 多线程一、进程与线程查看线程 二、线程创建方式三、线程状态四、线程常用方法五、线程安全 一、进程与线程 一个程序有一个进程 一个进程包含多个线程(必须有一个主线程) 并发: 在同一时刻&a…...
MT8370|MTK8370(Genio 510 )安卓核心板参数介绍
MTK Genio 510 (MT8370)安卓核心板是一款极为先进的高性能平台,专为满足边缘处理、先进多媒体功能及全面的连接需求而设计,适用于多种人工智能(AI)和物联网(IoT)应用场景。它具备多个高分辨率摄像头支持和可联网触摸屏显示,适用于使用多任务高…...
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
一、介绍 动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件&am…...
【STL】priority_queue 基础,应用与操作
c在C的标准模板库(STL)中,priority_queue 是一个基于堆的容器适配器,用于实现优先级队列。它本质上是一个最大堆(Max-Heap),即每次取出元素时,始终取出优先级最高的元素。本文将详细…...
tasklist命令的应用实例
tasklist命令的应用实例 引言 在系统管理和故障排查过程中,了解当前正在运行的进程信息是至关重要的。Windows操作系统提供了一个强大的命令行工具——tasklist,它可以帮助用户查看当前系统中所有正在运行的进程及其相关信息。掌握这个命令的使用&…...
基于协同过滤算法+PHP的新闻推荐系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤算法PHPMySQL的新…...
196页满分PPT | 集团流程优化及IT规划项目案例
细阐述了XX集团信息化建设的总体目标、指导原则、信息架构规划、应用系统架构规划、IT基础设施架构规划以及IT管控模式设计。文档内容涵盖了从现状分析到未来三年信息化建设目标的明确,以及如何通过IT系统支持集团的战略升级。 背景痛点 总体信息架构规划 总体信息架…...
Android 使用高德地图实现道格拉斯 - 普克算法
道格拉斯 - 普克算法(Douglas-Peucker algorithm)是一种用于曲线简化的算法。 一、算法的作用 该算法的主要目的是在保持曲线形状特征的前提下,通过减少数据点的数量来简化曲线。这在地图绘制、图形处理、地理信息系统等领域有广泛的应用。例…...
OpenAI GPT o1技术报告阅读(2)- 关于模型安全性的测试案例
✨报告阅读:使用大模型来学习推理(Reason) 首先是原文链接:https://openai.com/index/learning-to-reason-with-llms/ 接下来我们看一个简单的关于模型安全性的测试,当模型被问到一个有风险的话题时,会如何思考并回答用户呢&…...
Stream流的思想和获取Stream流
首先介绍流的概念: 流可以理解为一条流水线,在这条流水线中有许多操作,比如筛选所需要的数据,输出打印等, 经过这条流水线,可以获取到自己所需要的数据: -->所以: Stream流的作…...
go语言中的切片详解
1.概念 在Go语言中,切片(Slice)是一种基于数组的更高级的数据结构,它提供了一种灵活、动态的方式来处理序列数据。切片在Go中非常常用,因为它们可以动态地增长和缩小,这使得它们比固定大小的数组更加灵活。…...
ElK 8 收集 Nginx 日志
1. 说明 elk 版本:8.15.0 2. 启个 nginx 有 nginx 可以直接使用。我这里是在之前环境下 docker-compose.yml 中启动了个 nginx: nginx:restart: alwaysimage: nginx:1.26.1ports:- "80:80"- "443:443"volumes:#- ./nginx/html:/…...
Xv6驱动(四):CLINT
阅读材料 Xv6代码:memlayout.h、start.c、kernelvec.S教材5.4节 CLINT内存映射 实际上,CLINT还包括若干个MSIP寄存器,用来触发软件中断,但是在Xv6中不考虑软件中断,因此这些寄存器也不用考虑 // core local interr…...
【LInux】HTTPS是如何实现安全传输的
1. 客户端发起HTTPS连接请求 当浏览器请求一个HTTPS网址时,客户端(例如浏览器)会向服务器发起一个HTTPS请求。 2. 服务器返回数字证书 服务器收到请求后,会向客户端发送包含公钥的数字证书。数字证书由**权威认证机构ÿ…...
英飞凌PSoC4000T的GPIO中断示例工程
关于PSoC4000T的初步介绍见:英飞凌MCU第五代高性能CAPSENSE技术PSoC4000T_psoc 4000t-CSDN博客 下面这个工程,在modustoolbox中可编译、下载到开发板、debug调试。 编译时会用到mtb_shared这个库: 已经pdl这个periperal driver library库:...
物联网(IoT)中基于深度学习的入侵检测系统的综合综述
这篇论文是一篇全面的综述,标题为“A comprehensive survey on deep learning-based intrusion detection systems in Internet of Things (IoT)”,作者是Qasem Abu Al-Haija和Ayat Droos。论文主要探讨了在物联网(IoT)环境中基于深度学习的入侵检测系统…...
《成都体育学院学报》
投稿指南 成都体育学院学报属于体育类型期刊,由成都体育学院主办,国内统一刊号:51-1097/G8,国际标准刊号:1001-9154,双月,面向国内外公开发行。 一、来稿必须是作者独立取得的原创性学术研究成…...
Flask-JWT-Extended登录验证, 不用自定义
"""安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外,你还可以指定其他的选项,例如:过期时间 (max_age)࿱…...
rpm 与 yum
11 rpm -qa | grep openssh rpm与 yum CentOS仅删除软件包本身而不删除依赖 https://blog.csdn.net/kangshuaibi/article/details/125472204...
几种修改docker默认存储位置的方法
需求 docker容器存放目录磁盘空间满了,需要转移数据,修改Docker默认存储位置 解决方法 方法1:迁移到新目录 停止docker服务。 1systemctl stop docker; //每个liunx版本的命令不一样。创建新的docker目录,执行命令df…...
5KW MPPT控制器-太阳能系统用STM32F103RCT6主控平台
5KW MPPT控制器太阳能控制器 主控平台:STM32F103RCT6 逆变拓扑:BUCK-BOOST 功能:高效率MPPT控制器;支持给200V电池充电;485通讯,在线升级; 描述:本方案为AD格式原理图,PC…...
使用VESTA快速生成XRD标准图谱:从CIF文件到可视化分析
1. 从零开始:获取CIF文件与VESTA基础操作 搞材料研究的朋友们应该都遇到过这种情况:手头有套晶体结构数据,想快速验证下XRD图谱是否匹配理论值。这时候VESTA就是你的神器。我第一次用这软件时,被它的可视化效果惊艳到了——原来晶…...
SEO接单平台怎么选
SEO接单平台怎么选?详细指南解析 在当今数字化时代,SEO接单平台已经成为许多企业和自由职业者获取客户资源的重要途径。市场上充斥着各种SEO接单平台,如何选择一个合适的平台对于提升工作效率和业务发展至关重要。本文将详细介绍如何选择SEO…...
告别终端断开烦恼:nohup命令的完整使用指南(含日志管理技巧)
告别终端断开烦恼:nohup命令的完整使用指南(含日志管理技巧) 你是否遇到过这样的场景:在服务器上启动一个耗时任务,突然网络波动导致SSH连接断开,所有进度前功尽弃?作为开发者,这种经…...
Windows下OpenClaw安装指南:Qwen3-14b_int4_awq模型接入与飞书机器人配置
Windows下OpenClaw安装指南:Qwen3-14b_int4_awq模型接入与飞书机器人配置 1. 为什么选择OpenClaw作为个人自动化助手 去年年底,我开始寻找一款能够真正理解自然语言指令的本地自动化工具。当时市面上大多数RPA工具都需要复杂的流程设计,直到…...
BAAI/bge-m3新手指南:快速上手多语言文本语义分析服务
BAAI/bge-m3新手指南:快速上手多语言文本语义分析服务 1. 认识BAAI/bge-m3语义分析引擎 BAAI/bge-m3是由北京智源人工智能研究院开发的多语言通用嵌入模型,它能够将文本转换为高维向量表示,从而计算不同文本之间的语义相似度。这个模型在MT…...
SecGPT-14B多场景:安全设备日志归一化、威胁情报摘要生成、钓鱼邮件识别
SecGPT-14B多场景实战:安全设备日志归一化、威胁情报摘要生成、钓鱼邮件识别 在网络安全领域,每天面对海量的安全日志、繁杂的威胁情报和层出不穷的钓鱼邮件,安全分析师常常感到力不从心。手动处理这些信息不仅耗时耗力,还容易遗…...
Sony-PMCA-RE技术解析与实战指南:解锁Sony相机潜能的开源工具
Sony-PMCA-RE技术解析与实战指南:解锁Sony相机潜能的开源工具 【免费下载链接】Sony-PMCA-RE Reverse Engineering Sony Digital Cameras 项目地址: https://gitcode.com/gh_mirrors/so/Sony-PMCA-RE 一、价值定位:重新定义相机控制边界 1.1 开源…...
系统安全组件管理工具:Windows环境下安全服务的精细化控制方案
系统安全组件管理工具:Windows环境下安全服务的精细化控制方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mir…...
OpenClaw对比测试:千问3.5-9B与其他模型在自动化任务中的表现
OpenClaw对比测试:千问3.5-9B与其他模型在自动化任务中的表现 1. 测试背景与动机 作为一个长期使用OpenClaw进行个人工作流自动化的技术爱好者,我最近遇到了一个现实问题:当需要处理复杂任务链时,不同的大模型在OpenClaw框架下的…...
