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();
    }
}

相关文章
|
1月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
146 6
|
4月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
301 83
|
1月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
190 0
|
2月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
550 1
|
1月前
|
安全 前端开发 Java
从反射到方法句柄:深入探索Java动态编程的终极解决方案
从反射到方法句柄,Java 动态编程不断演进。方法句柄以强类型、低开销、易优化的特性,解决反射性能差、类型弱、安全性低等问题,结合 `invokedynamic` 成为支撑 Lambda 与动态语言的终极方案。
145 0
|
3月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
572 3
|
2月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
437 100
|
2月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
220 16
|
2月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
282 1
下一篇
oss云网关配置