40、Java 并发编程基础 ①

简介: 40、Java 并发编程基础 ①

一、进程(Process)

  • 进程:操作系统中运行的应用程序

  • 进程与进程之间是独立的
  • 每个进程都运行在其专用且受保护的内存空间中

二、线程(Thread)

  • 一个进程要想执行任务就必须要有线程(一个进程至少要有一个线程
  • 一个进程中的所有任务都在线程中执行

三、线程的串行

  • 线程中任务的执行是串行
  • 若要在一个线程中执行多个任务,那么只能一个一个地按顺序地执行这些任务
  • 同一时间内,一个线程只能执行一个任务

四、多线程

  • 一个进程中可以开启多个线程、所有线程并行(同时)执行不同的任务
  • 进程 👉 车间;线程 👉 车间工人
  • 多线程技术可以提高程序的执行效率

五、多线程原理

  • 同一时间,CPU 的一个核心只能处理一个线程(只有一个线程在工作)
  • 多线程并发(同时)执行,其实是 CPU 快速地在多个线程之间调度(切换)

  • 如果 CPU 调度线程的速度足够快,就造成了多条线程并发执行的假象
  • 如果是多核 CPU,才是真正地实现了多个线程同时执行
  • 若线程非常多:① CPU 将在多个线程之间来回调度,效率大量 CPU 资源;② 每条线程被调度执行地频次会降低(线程的执行效率会降低)

六、多线程优缺点

  • 优点:① 能适当提高线程的执行效率;② 能适当提高资源利用率(CPU、内存利用率)
  • 缺点:① 开启线程会占用一定的内存空间。若开启大量线程,会占用大量的内存空间,降低程序性能;② 线程越多,CPU 在调用线程上的开销越大

七、Java 的默认线程

  • 每个 Java 程序启动后会默认开启一个线程,称为主线程(main 方法所在线程)
  • 每一条线程都是一个 java.lang.Thread 对象,可通过 Thread.currentThread 方法获取当前线程的线程(Thread) 对象

八、开启新线程

(1) new Thread()

public class QQTest {
    public static void main(String[] args) {
        // ① 创建了线程对象 musicThread
        Thread musicThread = new Thread(new Runnable() {
            @Override
            public void run() {
                // 这条线程中要执行的任务
                System.out.println("\n播放音乐");
                System.out.println(Thread.currentThread());
            }
        });
        musicThread.setName("Thread-music");
        musicThread.setPriority(10);
        // ② 开启 musicThread 线程
        musicThread.start();
    }
}

(2) 继承 Thread,重写 run 方法

public class QQTest {
    public static void main(String[] args) {
        MusicThread musicThread = new MusicThread();
        musicThread.setName("Music-Thread");
        musicThread.start();
    }
}
class MusicThread extends Thread {
    @Override
    public void run() {
        // 该线程要执行的任务
        System.out.println(getName() + "_播放音乐");
    }
}

(3) run() 和 start()

public class QQTest {
    public static void main(String[] args) {
        Thread newThread = new Thread(() -> {
            System.out.println(Thread.currentThread());
        });
        // Thread[Thread-0,5,main]
        newThread.start();
        // Thread[main,5,main]
        newThread.run();
    }
}

九、多线程的内存布局

PC 寄存器(Program Counter Register):每个线程都有自己的 PC 寄存器。

PC 寄存器记录着 JVM 正在执行哪一条语句

Java 虚拟机栈(Java Virtual Machine Stack):每个线程都有自己的 Java 虚拟机栈

(Heap):多个线程共享堆空间

方法区(Method Area):多个线程共享方法区

方法区放代码

本地方法栈(Native Method Stack):每个线程都有自己的本地方法栈

十、线程的六种状态

  • 可通过 Thread 对象的 getState() 获得线程的状态

① NEW(新建):尚未启动

② RUNNABLE(可运行状态):正在 JVM 中运行【或正在等待操作系统的其他资源(如:处理器)】

③ BLOCKED(阻塞状态):正在等待监视器锁(内部锁)

④ WAITING(等待状态):在等待另一个线程

调用以下方法会进入 WAITING 状态:

✏️ 没有超时值的:Object.wait

✏️ 没有超时值的:Thread.join

✏️ LockSupport.park

⑤ TIMED_WAITING(定时等待状态)

调用以下方法会进入 TIMED_WAITING状态:

✏️ Thread.sleep

✏️ 有超时值的:Object.wait

✏️ 有超时值的:Thread.join

✏️ LockSupport.parkNanos

✏️ LockSupport.parkUntil

⑥ TERMINATED(终止状态):已经执行完毕

public class QQTest {
    public static void main(String[] args) {
        // 主线程对象
        Thread mainThread = Thread.currentThread();
        // RUNNABLE
        System.out.println(mainThread.getState().name());
        // 子线程
        Thread subThread = new Thread();
        // NEW
        System.out.println(subThread.getState().name());
    }
}

十一、sleep、interrupt

  • 可通过 Thread.sleep 方法暂停(睡眠)当前线程,进入 WAITING 状态
  • 在暂停(睡眠)期间,若调用线程对象的 interrupt 方法中断线程,会抛出 java.lang.InterruptedException
public class QQTest {
    public static void main(String[] args) {
        Thread subThread = new Thread(() -> {
            System.out.println("666");
            try {
                Thread.sleep(3333);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("520");
        });
        subThread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("111");
        subThread.interrupt();
    }
}

目录
打赏
0
0
0
0
11
分享
相关文章
【高薪程序员必看】万字长文拆解Java并发编程!(2 2-2)
📌 核心痛点暴击:1️⃣ 面了8家都被问synchronized锁升级?一张图看懂偏向锁→重量级锁全过程!2️⃣ 线程池参数不会配?高并发场景下这些参数调优救了项目组命!3️⃣ volatile双重检测单例模式到底安不安全?99%人踩过的内存可见性大坑!💡 独家亮点抢先看:✅ 图解JVM内存模型(JMM)三大特性,看完再也不怕指令重排序✅ 手撕ReentrantLock源码,AQS队列同步器实现原理大揭秘✅ 全网最细线程状态转换图(附6种状态转换触发条件表)
66 0
|
2月前
|
【高薪程序员必看】万字长文拆解Java并发编程!(5):深入理解JMM:Java内存模型的三大特性与volatile底层原理
JMM,Java Memory Model,Java内存模型,定义了主内存,工作内存,确保Java在不同平台上的正确运行主内存Main Memory:所有线程共享的内存区域,所有的变量都存储在主存中工作内存Working Memory:每个线程拥有自己的工作内存,用于保存变量的副本.线程执行过程中先将主内存中的变量读到工作内存中,对变量进行操作之后再将变量写入主内存,jvm概念说明主内存所有线程共享的内存区域,存储原始变量(堆内存中的对象实例和静态变量)工作内存。
98 0
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
66 0
2025 更新必看:Java 编程基础入门级超级完整版指南
本教程为2025更新版Java编程基础入门指南,涵盖开发环境搭建(SDKMAN!管理JDK、VS Code配置)、Java 17+新特性(文本块、Switch表达式增强、Record类)、面向对象编程(接口默认方法、抽象类与模板方法)、集合框架深度应用(Stream API高级操作、并发集合)、模式匹配与密封类等。还包括学生成绩管理系统实战项目,涉及Maven构建、Lombok简化代码、JDBC数据库操作及JavaFX界面开发。同时提供JUnit测试、日志框架使用技巧及进阶学习资源推荐,助你掌握Java核心技术并迈向高级开发。
155 5
Java 编程进阶实操中工具集整合组件封装方法与使用指南详解
本文详细介绍Hutool工具集和图书管理系统相关组件的封装方法及使用示例。通过通用工具类封装(如日期格式化、字符串处理、加密等)、数据库操作封装(结合Hutool DbUtil与MyBatis)、前端Vue组件封装(图书列表与借阅表单)以及后端服务层封装(业务逻辑实现与REST API设计),帮助开发者提升代码复用性与可维护性。同时,提供最佳实践建议,如单一职责原则、高内聚低耦合、参数配置化等,助力高效开发。适用于Java编程进阶学习与实际项目应用。
115 10
java 编程基础入门级超级完整版教程详解
这份文档是针对Java编程入门学习者的超级完整版教程,涵盖了从环境搭建到实际项目应用的全方位内容。首先介绍了Java的基本概念与开发环境配置方法,随后深入讲解了基础语法、控制流程、面向对象编程的核心思想,并配以具体代码示例。接着探讨了常用类库与API的应用,如字符串操作、集合框架及文件处理等。最后通过一个学生成绩管理系统的实例,帮助读者将理论知识应用于实践。此外,还提供了进阶学习建议,引导学员逐步掌握更复杂的Java技术。适合初学者系统性学习Java编程。资源地址:[点击访问](https://pan.quark.cn/s/14fcf913bae6)。
154 2
Java 编程进阶实操之工具集整合应用指南
本文聚焦Java编程进阶实操,涵盖并发编程、性能优化及数据库操作优化等核心知识点,并结合Hutool、Postman、Git等实用工具,提供从理论到实践的学习路径。通过小型图书管理系统实战项目,详细解析技术选型与实现步骤,助力开发者掌握Spring Boot、MyBatis等框架应用。同时展望Java新特性与技术趋势,为职业发展奠定基础。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
70 1
Java编程实用技巧:提升代码质量与开发效率
Java作为一门成熟且广泛应用的编程语言,掌握一些实用技巧可以显著提高开发效率和代码质量。以下是值得Java开发者掌握的实用技巧:
64 6
2025 年 Java 秋招面试必看 Java 并发编程面试题实操篇
Java并发编程是Java技术栈中非常重要的一部分,也是面试中的高频考点。本文从基础概念、关键机制、工具类、高级技术等多个方面进行了介绍,并提供了丰富的实操示例。希望通过本文的学习,你能够掌握Java并发编程的核心知识,在面试中取得好成绩。同时,在实际工作中,也能够运用这些知识设计和实现高效、稳定的并发系统。
46 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问