news 2026/7/16 14:27:44

Java中的多线程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java中的多线程

多线程

一、进程【理解】

1. 进程:操作系统(OS)中,每一个被执行的应用程序。

​2. 注意:目前操作系统支持多进程,并发执行的任务。

​3. 多进程并发执行的原理:微观上串行(一个一个的进程进行执行,获取cpu时间片的进程具有执行权),宏观上并行(所有的进程看似一起执行)

二、线程

1. 概念:在一个进程中,并发执行的多个任务。线程是进程执行任务的单元、单位。线程也被称为轻量级的进程。【理解】

​2. 主线程:目前程序为单线程,此线程以main函数的开始为开始,以main函数的结束为结束,此线程称主线程(主线程默认执行main函数)

​3. 线程的组成部分:【理解】

(1) cpu:获取到cpu时间片的线程获取执行权

(2) 数据:栈空间独立(每一个线程有独立的栈空间);堆空间共享(多个线程可以操作同一个空间)

(3) 程序代码:栈空间用于存储局部变量;堆空间用于存储对象。

​4. 代码实现多线程【重点】

(1) 第一种方式:

a. 类继承 java.lang.Thread 类,覆盖 run 方法

b. 创建线程对象: MyThread t1 = new MyThread();

c. 开启线程: t1.start(); //JVM默认执行 run 方法

(2) 第二种方式:

a. 类实现 java.lang.Runnable 接口,同时实现 run 方法

b. 创建线程的目标对象: Mytarget mt = new MyTarget();

c. 创建线程对象: Thread t2 = new Thread(mt); //将目标对象作为参数进行传递

d. 开启线程: t2.start(); //JVM默认调用 run 方法

三、线程状态【理解】

1. static void sleep(long ms) :让当前线程处于休眠状态,休眠的单位是毫秒(ms),处于休眠状态的线程进入有限期等待状态。 sleep 方法会让当前线程释放cpu,但是不释放标记。

2. void join() :让某一线程加入到自身任务中,在哪个线程中调用其他线程 join 方法,则代表此线程让其他线程优先执行,此线程从而进入无限期的等待状态。

例如:在主线程中main函数中: t.join(); 代表主线程让步于线程t执行

(线程状态流转图相关标注):

- New(新建状态):调用 start() 方法前的状态

​ Ready(就绪状态):获取CPU时间片则进入运行状态

​- Running(运行状态):执行 run() / main() 方法;调用 synchronized 进入阻塞,调用 sleep() / join() 进入等待

​Timed Waiting(限时等待): sleep() 时间到期回到就绪

​ Waiting(无限等待): join() 触发,需其他线程操作唤醒

​ Blocked(阻塞状态): synchronized 竞争资源失败时进入,获取到资源回到就绪

​Terminated(终止状态): run() 方法执行完毕

四、线程同步【重点】

1. 临界资源:多线程并发时,被多个线程共享的同一个对象,称为临界资源。

​2. 原子操作:不可以分割的多步操作,被视为一个整体,其执行顺序和步骤不能被打破。

​3. 线程同步:多线程并发访问时,为了保证临界资源的正确性,从而不破坏操作中的原子操作(保护原子操作不能被破坏)

​4. 线程同步的两种方式:

(1) 同步代码块:对临界资源对象进行加锁。

a. 定义位置:方法内部

b. 利用 synchronized 对临界资源加锁

c. 语法: synchronized(临界资源对象){ //原子操作 }

d. 执行的原理:当线程获取临界资源的标记时,锁标记空闲,则能获取该对象的锁标记,获取锁标记之后,可以执行同步代码块{}中的代码,而且只有当{}中所有的内容全部执行完,才释放锁对象的锁标记;但是当线程获取临界资源对象的锁标记时,锁标记已被其他线程占用,则此线程进入阻塞状态(Blocked状态),只有当其他线程释放锁标记,此线程获取锁标记,才结束阻塞状态,同时获取cpu,可以执行{}中的内容。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 5:40:08

Gazebo仿真入门:零基础搭建第一个机器人世界

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个交互式Gazebo学习助手,功能包括:1) 分步指导安装和配置Gazebo 2) 可视化界面创建简单机器人模型(如小车) 3) 拖拽式场景搭建 4) 基础物理属性调整演…

作者头像 李华
网站建设 2026/7/16 5:43:39

零基础玩转DHT11:从接线到数据读取全指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个面向初学者的DHT11教学项目,包含:1. 清晰的硬件接线示意图 2. 最简单的Arduino示例代码 3. 常见问题解答 4. 数据读取结果串口打印示例 5. 基础电路…

作者头像 李华
网站建设 2026/7/16 5:43:38

传统网络配置 vs AI辅助:处理10.8.8.8的效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个网络配置效率对比工具,分别展示手动配置10.8.8.8等IP的步骤和耗时,与AI自动化配置的流程对比。包含时间统计、错误率分析和配置复杂度评估。使用可视…

作者头像 李华
网站建设 2026/7/16 5:43:37

如何用AI自动修复代理连接错误?快马平台实战

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个能自动诊断和修复ERR_PROXY_CONNECTION_FAILED错误的工具。功能包括:1. 自动检测系统代理设置 2. 分析网络连接状态 3. 提供修复建议 4. 一键应用修复方案 5. 生…

作者头像 李华
网站建设 2026/7/16 11:04:30

传统vsAI:全球项目交付速度提升300%的秘诀

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个项目效率对比工具,能够并行运行传统开发流程和AI辅助流程,实时显示两者在代码生成、测试、部署等环节的时间差异和产出质量对比。工具应支持自定义项…

作者头像 李华
网站建设 2026/7/15 19:18:15

告别手动编写:AI一键生成完整docsify项目

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 请比较传统手动创建docsify项目需要:1.初始化项目 2.配置webpack 3.编写markdown 4.设置主题 5.添加插件等步骤。然后展示如何使用本平台一键生成包含所有这些要素的完整…

作者头像 李华