【JUC编程】JUC 多线程基础全面解析(待更新版)

embedded/2024/12/24 9:41:47/

文章目录

      • JUC 多线程基础全面解析
      • 一、线程与并发基础
        • 1. 什么是线程?
        • 2. 并发与并行的区别
        • 3. Java 线程的基本创建方式
      • 二、JUC 核心组件
        • 1. 线程池
        • 2. 锁机制
        • 3. 并发集合
      • 三、线程间通信工具
        • 1. `CountDownLatch`
        • 2. `CyclicBarrier`
        • 3. `Semaphore`
      • 四、原子操作类
      • 五、并发工具的使用场景和建议
      • 六、总结

JUC 多线程基础全面解析

Java 并发工具包(Java Util Concurrent,简称 JUC)是 Java 提供的一套强大的并发编程工具,主要用于简化多线程编程,提升并发程序的性能和可靠性。本文将从以下几个方面全面解析 JUC 的基础内容:


一、线程与并发基础

1. 什么是线程?

线程是 CPU 调度的最小单元。一个线程是一个独立的执行路径,可以与其他线程共享进程内的资源。

2. 并发与并行的区别
  • 并发(Concurrency):在同一时间间隔内处理多个任务。
  • 并行(Parallelism):在同一时刻执行多个任务。
3. Java 线程的基本创建方式
  • 继承 Thread

    java">class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread running");}
    }
    new MyThread().start();
    
  • 实现 Runnable 接口

    java">class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Runnable running");}
    }
    new Thread(new MyRunnable()).start();
    
  • 使用 CallableFuture

    java">import java.util.concurrent.Callable;
    import java.util.concurrent.FutureTask;Callable<Integer> task = () -> {return 123;
    };
    FutureTask<Integer> futureTask = new FutureTask<>(task);
    new Thread(futureTask).start();
    System.out.println(futureTask.get());
    

二、JUC 核心组件

1. 线程池

线程池是 JUC 提供的一个重要工具,用于复用线程以减少线程创建和销毁的开销。

  • 线程池创建方式

    java">import java.util.concurrent.Executors;
    import java.util.concurrent.ExecutorService;ExecutorService pool = Executors.newFixedThreadPool(5);
    pool.execute(() -> System.out.println("Task executed"));
    pool.shutdown();
    
  • 常见线程池类型

    • FixedThreadPool:固定大小的线程池。
    • CachedThreadPool:动态扩展的线程池。
    • SingleThreadExecutor:单线程池。
    • ScheduledThreadPool:支持定时任务。
2. 锁机制

JUC 提供了更高级的锁,代替传统的 synchronized

  • ReentrantLock

    java">import java.util.concurrent.locks.ReentrantLock;ReentrantLock lock = new ReentrantLock();lock.lock();
    try {System.out.println("Critical section");
    } finally {lock.unlock();
    }
    
  • ReadWriteLock 读写锁允许多个读线程同时访问,但写线程独占。

    java">import java.util.concurrent.locks.ReentrantReadWriteLock;ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();rwLock.readLock().lock();
    try {System.out.println("Reading");
    } finally {rwLock.readLock().unlock();
    }
    
3. 并发集合

JUC 提供了线程安全的集合类。

  • ConcurrentHashMap:高效的线程安全哈希表。
  • CopyOnWriteArrayList:适用于读多写少的场景。
  • BlockingQueue:支持线程间安全通信的队列。

三、线程间通信工具

1. CountDownLatch

计数器,等待多个线程完成任务。

java">import java.util.concurrent.CountDownLatch;CountDownLatch latch = new CountDownLatch(3);new Thread(() -> {System.out.println("Task 1");latch.countDown();
}).start();latch.await();
System.out.println("All tasks completed");
2. CyclicBarrier

线程到达屏障后一起执行。

java">import java.util.concurrent.CyclicBarrier;CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("Barrier reached"));new Thread(() -> {System.out.println("Task 1");barrier.await();
}).start();
3. Semaphore

控制线程并发数。

java">import java.util.concurrent.Semaphore;Semaphore semaphore = new Semaphore(2);new Thread(() -> {semaphore.acquire();System.out.println("Task running");semaphore.release();
}).start();

四、原子操作类

JUC 提供了一些高效的原子操作类,避免使用锁的开销。

  • AtomicInteger

    java">import java.util.concurrent.atomic.AtomicInteger;AtomicInteger count = new AtomicInteger(0);
    count.incrementAndGet();
    
  • AtomicReference

    java">import java.util.concurrent.atomic.AtomicReference;AtomicReference<String> ref = new AtomicReference<>("A");
    ref.compareAndSet("A", "B");
    

五、并发工具的使用场景和建议

  1. 线程池:适用于需要频繁创建和销毁线程的场景。
  2. :在读多写少场景下,优先考虑 ReadWriteLock
  3. 并发集合:推荐在多线程环境下使用。
  4. 线程间通信CountDownLatchCyclicBarrier 适合多线程协作。

六、总结

JUC 是 Java 提供的一套强大的并发工具,它简化了多线程编程的复杂性,同时提供了高效、安全的解决方案。通过合理使用线程池、锁机制、并发集合以及线程通信工具,我们可以更高效地开发并发程序。在实际开发中,应根据具体场景选择合适的工具,以保证性能与安全性。


博客主页: 总是学不会.


http://www.ppmy.cn/embedded/148300.html

相关文章

dcdc buck闭环数控型稳压电源仿真+单片机程序及实验报告

资料下载地址&#xff1a;dcdc buck闭环数控型稳压电源仿真单片机程序及实验报告 一、实验目的 设计并制作一台数控型DCDC稳压电源。 二、实验要求 1、输出电压范围 &#xff1a;0.5v~4.5v。可以通过按键实现电压调整 2、必须使用PID闭环控制算法 3、发挥部分&#xff1a; PID…

刷题 两数之和

https://leetcode.cn/problems/two-sum/submissions/588870256/?envTypestudy-plan-v2&envIdtop-100-liked 参考快排算法 https://blog.csdn.net/oSKyTonight/article/details/129813861 /** Note: The returned array must be malloced, assume caller calls free(). */…

MapReduce的shuffle过程详解

文章目录 MapReduce的shuffle过程详解一、引言二、Shuffle过程详解1、Map端Shuffle1.1、分区&#xff08;Partition&#xff09;1.2、排序&#xff08;Sort&#xff09;1.3、分割&#xff08;Spill&#xff09; 2、Reduce端Shuffle 三、使用示例四、总结 MapReduce的shuffle过程…

stm32中有哪些库?其中标准库和HAL库有什么区别?

stm32中有哪些库&#xff1f; 1. STM32标准外设库&#xff08;Standard Peripheral Library&#xff09; 介绍&#xff1a;STM32 标准外设库是 STM32 官方提供的一个硬件抽象库&#xff0c;旨在简化对 STM32 各类外设&#xff08;如 GPIO、UART、SPI、I2C、ADC、PWM 等&#x…

(补)算法刷题Day24: BM61 矩阵最长递增路径

题目链接 思路 方法一&#xff1a;dfs暴力回溯 使用原始used数组4个方向遍历框架 &#xff0c; 全局添加一个最大值判断最大的路径长度。 方法二&#xff1a;加上dp数组记忆的优雅回溯 抛弃掉used数组&#xff0c;使用dp数组来记忆遍历过的节点的最长递增路径长度。每遍历到已…

LeetCode 209. 长度最小的子数组 (C++实现)

1. 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输…

32岁前端干了8年,是继续做前端开发,还是转其它工作

前端发展有瓶颈&#xff0c;变来变去都是那一套&#xff0c;只是换了框架换了环境。换了框架后又得去学习&#xff0c;虽然很快上手&#xff0c;但是那些刚毕业的也很快上手了&#xff0c;入门门槛越来越低&#xff0c;想转行或继续卷&#xff0c;该如何破圈 这是一位网友的自述…

Docker部署GitLab服务器

一、GitLab介绍 1.1 GitLab简介 GitLab 是一款基于 Git 的开源代码托管平台&#xff0c;集成了版本控制、代码审查、问题跟踪、持续集成与持续交付&#xff08;CI/CD&#xff09;等多种功能&#xff0c;旨在为团队提供一站式的项目管理解决方案。借助 GitLab&#xff0c;开发…