13、Java 多线程与并发编程详解

【金三银四】Java并发编程面试题(2021最新版) 目录 前言 一、基础知识 1. 为什么要使用并发编程 2. 多线程应用场景 3. 并发编程有什么缺点 4. 并发编程三个必要因素是什么? 5. Java 程序中怎么保证多线程的运行安全? 6. 并行和并发有什么区别? 7. 什么是多线程 8. 多线程的好处 9. 多线程的劣势: 10. 线程和进程区别 11. 什么是上下文切换? 12. 守护线程和用户线程有什么区别呢? 13. 如何在 Windows 和 Linux 上查找哪个线程cpu利用率最高? 14. 什么是线程死锁 阅读详情

开篇概览:并发编程的核心价值

并发(Concurrency) 是指多个任务在同一时间段内交替执行,而并行(Parallelism) 是指多个任务在同一时刻同时执行。Java 通过多线程(Multithreading) 实现并发,使程序能够:

  • 提升 CPU 利用率(尤其在多核系统);
  • 改善响应性(如 GUI 应用不卡顿);
  • 提高吞吐量(如 Web 服务器处理多请求)。

本章将系统讲解 Java 并发编程的核心知识体系:

  1. 线程与进程基础概念;
  2. 创建线程的两种方式;
  3. 线程生命周期与状态;
  4. 线程同步与锁机制(synchronized、Lock);
  5. 线程间通信(wait()/notify());
  6. 线程池(ExecutorService);
  7. 高级并发工具简介(java.util.concurrent 包)。

⚠️ 重要前提:

  • 线程是轻量级进程,共享进程内存;
  • 多线程带来性能提升的同时,也引入线程安全问题(如竞态条件、死锁);
  • 并发 ≠ 并行:单核 CPU 也能并发(时间片轮转),多核才能并行。

一、线程与进程的概念

1.1 进程(Process)

  • 操作系统分配资源的基本单位;
  • 拥有独立的内存空间(堆、栈、代码段等);
  • 进程间通信(IPC)成本高(如管道、消息队列)。

1.2 线程(Thread)

  • CPU 调度的基本单位;
  • 同一进程内的线程共享堆内存,但栈独立;
  • 线程间通信成本低(直接读写共享变量);
  • 创建/切换开销远小于进程。

1.3 Java 线程模型

  • Java 线程是1:1 模型(每个 Java 线程对应一个 OS 线程);
  • 由 JVM 和操作系统共同管理;
  • 主线程(main 方法所在线程)启动后,可创建子线程。

二、创建线程的两种方式

2.1 方式一:继承 Thread 类

步骤:
  1. 自定义类继承 Thread;
  2. 重写 run() 方法(线程执行体);
  3. 创建对象并调用 start() 启动线程。
示例:继承 Thread
// 中文注释:定义一个下载任务线程类
class DownloadThread extends Thread {
    private String fileName;

    public DownloadThread(String fileName) {
        this.fileName = fileName;
    }

    // 重写 run() 方法:线程启动后执行的逻辑
    @Override
    public void run() {
        System.out.println("开始下载文件: " + fileName);
        try {
            // 模拟下载耗时操作(休眠2秒)
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            System.err.println("下载被中断: " + e.getMessage());
        }
        System.out.println("文件下载完成: " + fileName);
    }
}

public class ThreadInheritanceDemo {
    public static void main(String[] args) {
        // 创建两个下载线程
        DownloadThread thread1 = new DownloadThread("report.pdf");
        DownloadThread thread2 = new DownloadThread("image.jpg");

        // 启动线程(调用 start(),而非 run()!)
        thread1.start();
        thread2.start();

        // 主线程继续执行
        System.out.println("主线程继续执行其他任务...");
    }
}

✅ 关键点:

  • 必须调用 start(),直接调用 run() 是同步执行;
  • Java 单继承限制:若类已继承其他类,则无法再继承 Thread。

2.2 方式二:实现 Runnable 接口(推荐)

步骤:
  1. 自定义类实现 Runnable 接口;
  2. 实现 run() 方法;
  3. 创建 Thread 对象,传入 Runnable 实例;
  4. 调用 start() 启动线程。
示例:实现 Runnable
// 中文注释:定义一个任务类,实现 Runnable 接口
class PrintTask implements Runnable {
    private String taskName;

    public PrintTask(String taskName) {
        this.taskName = taskName;
    }

    @Override
    public void run() {
        for (int i = 1; i <= 3; i++) {
            System.out.println(taskName + " 执行第 " + i + " 次");
            try {
                Thread.sleep(500); // 模拟任务耗时
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt(); // 恢复中断状态
                System.err.println(taskName + " 被中断");
            }
        }
    }
}

public class RunnableDemo {
    public static void main(String[] args) {
        // 创建 Runnable 任务
        PrintTask task1 = new PrintTask("任务A");
        PrintTask task2 = new PrintTask("任务B");

        // 将任务提交给线程执行
        Thread thread1 = new Thread(task1);
        Thread thread2 = new Thread(task2);

        thread1.start();
        thread2.start();

        System.out.println("主线程结束");
    }
}

✅ 优势:

  • 避免单继承限制;
  • 任务与线程解耦,更符合面向对象设计;
  • 可被线程池复用(见后文)。

三、线程的生命周期与状态

Java 线程有 6 种状态(java.lang.Thread.State):

状态说明触发条件
NEW新建new Thread() 后,未调用 start()
RUNNABLE可运行调用 start() 后,等待 CPU 调度(含运行中)
BLOCKED阻塞等待获取 synchronized 锁
WAITING等待调用 wait(), join(), LockSupport.park()
TIMED_WAITING计时等待调用 sleep(), wait(timeout), join(timeout)
TERMINATED终止run() 执行完毕或异常退出

状态转换图

NEW 
  ↓ start()
RUNNABLE ←→ BLOCKED (等待锁)
  ↓ 
WAITING / TIMED_WAITING (主动等待)
  ↓ notify()/超时/中断
RUNNABLE
  ↓ run()结束
TERMINATED
示例:观察线程状态
public class ThreadStateDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            try {
                Thread.sleep(2000); // TIMED_WAITING
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        System.out.println("1. 初始状态: " + thread.getState()); // NEW

        thread.start();
        System.out.println("2. 启动后状态: " + thread.getState()); // RUNNABLE 或 TIMED_WAITING

        Thread.sleep(100); // 确保线程进入 sleep
        System.out.println("3. sleep 中状态: " + thread.getState()); // TIMED_WAITING

        thread.join(); // 等待线程结束
        System.out.println("4. 结束后状态: " + thread.getState()); // TERMINATED
    }
}

四、线程同步与锁机制

4.1 问题:竞态条件(Race Condition)

当多个线程并发修改共享数据时,结果依赖于线程执行顺序,导致不可预测的错误。

示例:未同步的计数器
class Counter {
    private int count = 0;

    public void increment() {
        count++; // 非原子操作:读取 → 修改 → 写入
    }

    public int getCount() {
        return count;
    }
}

public class RaceConditionDemo {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();
        Thread[] threads = new Thread[10];

        // 创建10个线程,每个线程递增1000次
        for (int i = 0; i < 10; i++) {
            threads[i] = new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    counter.increment();
                }
            });
            threads[i].start();
        }

        // 等待所有线程结束
        for (Thread t : threads) {
            t.join();
        }

        System.out.println("期望值: 10000, 实际值: " + counter.getCount()); 
        // 实际值 < 10000(因竞态条件)
    }
}

4.2 解决方案一:synchronized 关键字

原理:
  • 基于 JVM 内置锁(Monitor Lock);
  • 同一时刻只有一个线程能进入同步代码块/方法。
三种用法:
  1. 同步实例方法:锁当前对象(this);
  2. 同步静态方法:锁类对象(Class);
  3. 同步代码块:锁指定对象。
示例:使用 synchronized 修复计数器
class SafeCounter {
    private int count = 0;

    // 方式1:同步实例方法(锁 this)
    public synchronized void increment() {
        count++;
    }

    // 方式2:同步代码块(更灵活)
    public void decrement() {
        synchronized (this) {
            count--;
        }
    }

    public int getCount() {
        return count;
    }
}

public class SynchronizedDemo {
    public static void main(String[] args) throws InterruptedException {
        SafeCounter counter = new SafeCounter();
        Thread[] threads = new Thread[10];

        for (int i = 0; i < 10; i++) {
            threads[i] = new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    counter.increment();
                }
            });
            threads[i].start();
        }

        for (Thread t : threads) {
            t.join();
        }

        System.out.println("期望值: 10000, 实际值: " + counter.getCount()); // 10000
    }
}

✅ 关键点:

  • synchronized 是可重入锁(同一线程可多次获取);
  • 锁对象必须一致(如都用 this)。

4.3 解决方案二:Lock 接口(java.util.concurrent.locks)

优势 vs synchronized:
  • 显式加锁/解锁,更灵活;
  • 支持尝试加锁(tryLock());
  • 支持可中断锁(lockInterruptibly());
  • 支持公平锁(按请求顺序获取)。
核心接口:Lock
方法说明
lock()获取锁(阻塞)
unlock()释放锁(必须在 finally 中调用)
tryLock()尝试获取锁(立即返回)
lockInterruptibly()可中断地获取锁
示例:使用 ReentrantLock
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class LockCounter {
    private int count = 0;
    private final Lock lock = new ReentrantLock(); // 可重入锁

    public void increment() {
        lock.lock(); // 获取锁
        try {
            count++;
        } finally {
            lock.unlock(); // 必须在 finally 中释放
        }
    }

    public int getCount() {
        return count;
    }
}

public class LockDemo {
    public static void main(String[] args) throws InterruptedException {
        LockCounter counter = new LockCounter();
        Thread[] threads = new Thread[10];

        for (int i = 0; i < 10; i++) {
            threads[i] = new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    counter.increment();
                }
            });
            threads[i].start();
        }

        for (Thread t : threads) {
            t.join();
        }

        System.out.println("期望值: 10000, 实际值: " + counter.getCount()); // 10000
    }
}

✅ 最佳实践:

  • 永远在 finally 块中释放锁;
  • 优先使用 synchronized(简单场景),复杂场景用 Lock。

五、线程间通信:wait() / notify() / notifyAll()

5.1 为什么需要线程通信?

  • 线程间需要协调工作(如生产者-消费者);
  • synchronized 仅保证互斥,不提供等待/唤醒机制。

5.2 核心方法(必须在 synchronized 块中调用)

方法说明
wait()释放锁,进入等待队列
notify()唤醒一个等待线程
notifyAll()唤醒所有等待线程

⚠️ 重要规则:

  • 必须在同步代码块中调用;
  • 调用对象必须是锁对象;
  • wait() 会释放锁,notify() 不会。

5.3 示例:生产者-消费者模型

import java.util.LinkedList;
import java.util.Queue;

// 中文注释:共享缓冲区(线程安全)
class Buffer {
    private final Queue<Integer> queue = new LinkedList<>();
    private final int capacity = 5;

    // 生产者放入数据
    public synchronized void produce(int item) throws InterruptedException {
        // 缓冲区满时等待
        while (queue.size() == capacity) {
            System.out.println("缓冲区已满,生产者等待...");
            wait(); // 释放锁,进入等待队列
        }

        queue.offer(item);
        System.out.println("生产: " + item + ", 缓冲区大小: " + queue.size());

        notifyAll(); // 唤醒所有消费者
    }

    // 消费者取出数据
    public synchronized int consume() throws InterruptedException {
        // 缓冲区空时等待
        while (queue.isEmpty()) {
            System.out.println("缓冲区为空,消费者等待...");
            wait(); // 释放锁,进入等待队列
        }

        int item = queue.poll();
        System.out.println("消费: " + item + ", 缓冲区大小: " + queue.size());

        notifyAll(); // 唤醒所有生产者
        return item;
    }
}

public class ProducerConsumerDemo {
    public static void main(String[] args) {
        Buffer buffer = new Buffer();

        // 生产者线程
        Thread producer = new Thread(() -> {
            for (int i = 1; i <= 10; i++) {
                try {
                    buffer.produce(i);
                    Thread.sleep(100); // 模拟生产间隔
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });

        // 消费者线程
        Thread consumer = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    buffer.consume();
                    Thread.sleep(150); // 模拟消费间隔
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });

        producer.start();
        consumer.start();
    }
}

✅ 关键点:

  • 使用 while 而非 if 检查条件(避免虚假唤醒);
  • 优先使用 notifyAll()(除非确定只需唤醒一个)。

六、线程池(ExecutorService)

6.1 为什么需要线程池?

  • 避免频繁创建/销毁线程(开销大);
  • 控制并发数量(防止资源耗尽);
  • 统一管理线程生命周期。

6.2 核心接口:ExecutorService

方法说明
submit(Runnable/Callable)提交任务,返回 Future
execute(Runnable)提交任务(无返回值)
shutdown()平滑关闭(等待任务完成)
shutdownNow()立即关闭(尝试中断任务)

6.3 创建线程池:Executors 工厂类

方法说明
newFixedThreadPool(n)固定大小线程池
newCachedThreadPool()缓存线程池(空闲60秒回收)
newSingleThreadExecutor()单线程池(保证顺序执行)
newScheduledThreadPool(n)支持定时/周期任务

⚠️ 生产环境建议:
不要使用 Executors!应使用 ThreadPoolExecutor 手动创建,避免 FixedThreadPool 的 LinkedBlockingQueue 无界队列导致 OOM。


6.4 示例:使用线程池处理任务

import java.util.concurrent.*;

public class ThreadPoolDemo {
    public static void main(String[] args) {
        // 创建固定大小为3的线程池
        ExecutorService executor = Executors.newFixedThreadPool(3);

        // 提交10个任务
        for (int i = 1; i <= 10; i++) {
            final int taskId = i;
            executor.execute(() -> {
                System.out.println("任务 " + taskId + " 由线程 " + 
                    Thread.currentThread().getName() + " 执行");
                try {
                    Thread.sleep(1000); // 模拟任务耗时
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                System.out.println("任务 " + taskId + " 完成");
            });
        }

        // 关闭线程池(不再接受新任务)
        executor.shutdown();
        try {
            // 等待所有任务完成(最多60秒)
            if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
                executor.shutdownNow(); // 强制关闭
            }
        } catch (InterruptedException e) {
            executor.shutdownNow();
            Thread.currentThread().interrupt();
        }

        System.out.println("所有任务已完成");
    }
}

✅ 输出特点:

  • 同一时刻最多3个任务并发执行;
  • 线程被复用(如 pool-1-thread-1 执行多个任务)。

七、高级并发工具简介(java.util.concurrent)

7.1 Callable 与 Future

  • Callable:类似 Runnable,但有返回值、可抛出异常;
  • Future:获取异步计算结果。
示例:
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<Integer> task = () -> {
    Thread.sleep(1000);
    return 42;
};

Future<Integer> future = executor.submit(task);
System.out.println("结果: " + future.get()); // 阻塞直到完成

7.2 CountDownLatch

  • 允许一个或多个线程等待其他线程完成操作。
示例:等待所有服务启动
CountDownLatch latch = new CountDownLatch(3);

for (int i = 0; i < 3; i++) {
    new Thread(() -> {
        // 模拟服务启动
        System.out.println("服务启动中...");
        latch.countDown(); // 计数减1
    }).start();
}

latch.await(); // 等待计数归零
System.out.println("所有服务已启动");

7.3 CyclicBarrier

  • 让一组线程互相等待,直到所有线程都到达屏障点。
示例:多线程计算后汇总
CyclicBarrier barrier = new CyclicBarrier(3, () -> {
    System.out.println("所有线程计算完成,开始汇总结果");
});

for (int i = 0; i < 3; i++) {
    new Thread(() -> {
        // 模拟计算
        System.out.println("线程 " + Thread.currentThread().getName() + " 计算中");
        try {
            barrier.await(); // 等待其他线程
        } catch (Exception e) {
            e.printStackTrace();
        }
    }).start();
}

7.4 并发集合

  • ConcurrentHashMap:线程安全的 HashMap;
  • CopyOnWriteArrayList:写时复制的 List(读多写少场景);
  • BlockingQueue:阻塞队列(如 ArrayBlockingQueue, LinkedBlockingQueue)。

八、总结:并发编程核心原则

问题解决方案
线程创建优先 Runnable + 线程池
线程安全synchronized / Lock
线程通信wait()/notify() 或 Condition
任务管理ExecutorService
高级协调CountDownLatch, CyclicBarrier, Semaphore
安全集合ConcurrentHashMap, BlockingQueue

📌 核心思想:
“并发编程的目标不是让程序跑得更快,而是让程序在多任务环境下正确、高效地运行。”
掌握 Java 并发,是构建高性能、高可靠系统的必备能力。务必牢记:简单场景用 synchronized,复杂场景用 java.util.concurrent。

Java并发编程原理与实战 推荐视频链接 Java 微服务实践视频教程 - Spring Boot Java 微服务实践 视频教程- Spring Cloud redis高可用视频 分布式电商商城视频教程 kubernets+docer jvm 秒杀项目实战 Linux shell java并发编程是一个优秀的开发者成长过程中绕不过去的挑战。数据库服务,Web服务,大数据处理框架,分布式服务等等,并发编程往往扮演着极其重... 阅读详情

相关推荐

在 Windows 上安装 OpenCV – C++ / Python

而且,安装并不是一件容易的事。这些安装程序仅适用于安装 OpenCV for C++。如果您想安装适用于 Python 的 OpenCV,您将在博客后面找到相关信息。在这篇博文中,我们将在 Windows 上安装适用于 C++ 和 Python 的 OpenCV。C++ 安装是在自定义安装 exe 文件的帮助下完成的。而Python的安装是通过Anaconda完成的。从源代码安装 OpenCV 需要花费大量时间。根据您的硬件和安装配置,该过程可能需要 5 分钟到 2 小时不等。

Demondai999的博客 2090

java并发编程和多线程总结

java并发编程和多线程总结

卓越之识论道,平常之识论事,狭隘之识论人 2064

DeepSeek高阶应用:DeepSeek+Coze构建智能文献综述与趋势分析自动化系统

本文详细介绍了如何利用DeepSeek与Coze构建智能文献综述与趋势分析自动化系统。通过DeepSeek的深度语义理解和结构化信息提取能力,结合Coze的可视化工作流编排,实现学术论文的自动解析、分类整理与知识入库。该系统能7x24小时自动追踪领域前沿,将研究人员从繁琐的文献处理中解放出来,专注于更高层次的思考与创新。

weixin_29050271的博客 179

Java并发编程 - 认识并发编程 之 线程与多线程

Java 并发编程是现代软件开发中非常重要的一个领域,特别是在多核处理器和分布式系统变得越来越普遍的今天。并发编程涉及如何设计程序使其能够同时执行多个任务,从而提高系统的效率和响应能力。在 Java 中,实现并发的主要机制包括线程(Thread)和多线程(Multithreading)。

qq_33240556的博客 987

用Quartus II和LPM_ROM手把手复现西电计组课设:从微指令到五条指令的完整流程

本文详细介绍了使用Quartus II和LPM_ROM复现西电计组课设的完整流程,从微指令编写到五条指令的实现。通过环境搭建、LPM_ROM配置、微程序设计及调试技巧,帮助读者高效完成课程设计,避开常见问题。适合计组课程设计的学习者和实践者参考。

weixin_29288313的博客 456

基于 MATLAB 的综合能源系统建模案例 

电平衡约束:P_{gt}(t)+P_{grid}(t)-P_{eb}(t)-P_{load}(t)=0,其中 P_{grid}(t) 为与外部电网的交互功率(正表示购电,负表示售电)。- 电锅炉的热输出功率 Q_{eb} 与输入电功率 P_{eb} 的关系为:Q_{eb}=\eta_{eb}\times P_{eb},其中 \eta_{eb} 为电锅炉的热效率。- 燃气轮机的余热回收功率 Q_{gt} 与发电功率也存在一定关系,例如:Q_{gt}=c\times P_{gt},c 为余热回收比例系数。

qq_57128262的博客 1394

Java 并发编程详解:多线程和架构设计(20250123)

Java 并发编程详解:多线程和架构设计(20250123)

weixin_45428910的博客 682

win10 离线安装.Net Framework3.5

起因,安装软件比如3dmax2014等需要.Net Framework3.5支撑,那么需要安装低版本的.Net Framework3.5 闲话少说。 1.下载 NetFx3.cab 链接: https://pan.baidu.com/s/124to7F3BOy4yAlY61OjbDg 提取码: kixu 2.将NetFx3.cab 放入 系统盘的windows目录下(示例 C:\Wi...

m0_37615458的博客 7712

Java中的多线程与并发编程

Java中的多线程与并发编程大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一下Java中的多线程与并发编程。多线程编程可以充分利用CPU资源,提高程序的运行效率。然而,由于多线程编程的复杂性,开发过程中需要特别注意线程安全和死锁等问题。本文将介绍Java多线程的基本概念、线程的...

weixin_40942424的博客 177

手把手教你用Zemax优化MTF:从‘离焦平衡球差’到高频像差控制的实战技巧

本文详细介绍了如何使用Zemax优化MTF性能,从基础设置到高级技巧的全流程。通过具体案例,讲解了如何利用离焦平衡球差提升中频MTF,以及识别和控制高频像差的方法,帮助光学设计工程师和学生有效提升成像质量。

weixin_30752699的博客 748

【同等学力】2005-数学⭐✨

有r个正方形排成一行,今用红、黄、白、蓝四种颜色给这个r个正方形染色,每个正方形只能染一种颜色,如果要求染红、黄、白色的正方形分别至少出现一个,问有多少种不同的染法?3、(4分)设G是一个有n个结点m条边的连通简单平面图,若n≥3,则m≤3n-6.4、(4分)证明:任何连通简单平面图至少有一个结点的度数不超过5

super_mochi1 305

Java多线程与线程池技术详解(十)

首先,我们需要构建一个自定义线程池,这包括设置核心线程数()、最大线程数()、保持活动时间()、工作队列(workQueue)和拒绝策略(handler这里我们以为例,它允许我们在运行时暂停和恢复线程池中的任务执行。

物联网工程专业 - 软硬兼修 1238

人工智能训练师三级考试题型全解析|190道真题样例+30天备考路线

人工智能训练师三级考试并不神秘:理论考190道选择题(刷题就能过),实操考代码+方案设计(练练就会)。核心是花时间——30天系统备考,足以从容通过。如果你想从零开始系统备考,覆盖所有考点和实操技能,欢迎查看我的专栏:📖《人工智能训练师三级·从零到拿证完全指南》80篇系统化内容,覆盖报名、备考、冲刺、拿证全流程六大模块知识点逐个击破,每个考点都讲透实操代码题手把手教学,附带完整参考代码高频考点速记 + 易错题精讲 + 3套模拟试卷30天备考计划 + 冲刺复习策略。

白话机器学习 6053

多线程--JUC并发编程

多线程、并发相关知识点

weixin_45690338的博客 2095

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java多线程与并发编程

Java多线程与并发编程

weixin_45427945的博客 878

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JUC并发编程超详细详解篇

文章目录前言一、JUC并发编程简介及准备1.1.本系列讲解思路1.2.知识储备1.3.用到的依赖1.4.logback.xml 配置二、进程与线程2.1.进程与线程2.1.1.进程2.1.2.线程2.1.3.对比2.2.并行与并发2.2.1.两者区别直观解释2.3.应用2.3.1. 应用之异步调用(案例1)2.3.2.应用之提高效率(案例1)三、Java 线程3.1.本节主讲内容3.2.创建和运行线程3.2.1.方法一,直接使用 Thread3.2.2.方法二,使用 Runnable 配合 Thread3.

白大锅的博客,毕设WangLoveBai_999 7万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java并发编程01:Java多线程基础(synchronized,volatile,wait/notify)

多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础多线程基础 ...

ncepu_Chen的博客 2738

《JAVA并发编程的艺术》之 Java中的13个原子操作类

《JAVA并发编程的艺术》之 Java中的13个原子操作类 文章目录《JAVA并发编程的艺术》之 Java中的13个原子操作类原子更新基本类型类原子更新数组原子更新引用类型原子更新字段类 当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2。 因为A和B线程在更新变量i的时候拿到的i都是1,这就是线程不安全的更新操作,通常我们会使用synchronized来解决这个问题,synchroni

weixin_44019182的博客 978

14天Java基础学习——第13天:多线程与并发编程

本章节详细介绍了Java中的多线程与并发编程。我们学习了线程与进程的概念,以及它们之间的区别。通过实际的代码示例,我们了解了如何使用Thread类和Runnable接口来创建和管理线程。我们还探讨了线程的状态与生命周期,以及如何通过关键字来实现线程同步。这些知识是并发编程的基础,掌握它们对于编写高效、稳定的多线程程序至关重要。通过这些学习,我们可以更好地理解和应用Java中的并发机制,提高程序的性能和响应能力。

weixin_38492276的博客 364

java多线程并发之旅-01-多线程并发教程概览

本系列学习目的 提升对于 java 多线程的理解,要学会横向对比学习,多看些文章。 目前大部分的文章都是止步于创建和常见的类,本系列重在实践,参考书籍《java 并发编程实战》《Java并发编程的艺术》 后续原理参考《深入理解并行编程》。 对于 java 多线程的基础知识,参考 Java Thread 小结 经典书籍《图解 Java 多线程设计模式》 系列学习笔记。 对于 jvm 相关知识不用重复...

1万+

【JUC面试篇】Java并发编程高频八股——线程与多线程

本文总结了Java线程的核心概念和常见问题,主要内容包括:进程与线程的区别、线程创建4种方式(继承Thread、实现Runnable/Callable、线程池)、线程的6种状态(NEW、RUNNABLE等)、线程间通信方法(共享变量、wait/notify、Lock/Condition、阻塞队列等)。重点分析了线程同步机制(synchronized和volatile)、死锁条件及避免方法,并比较了sleep与wait、notify与notifyAll等关键操作的区别,为Java多线程编程提供了实用指导。

gadiaola的博客 1168

《Java并发编程的艺术》之 Java并发编程基础

《Java并发编程的艺术》之 Java并发编程基础 文章目录《Java并发编程的艺术》之 Java并发编程基础线程简介什么是线程代码清单4-1 MultiThread.java解析为什么要使用多线程更多的处理器核心更快的响应时间线程优先级代码清单4-2 Priority.java结果注意参数解析线程的状态注意Daemon线程注意注意启动和终止线程构造线程代码清单4-6 Thread.java启动线程注意理解中断代码清单4-7 Interrupted.java过期的suspend()、resume()和sto

weixin_44019182的博客 2495

Java并发编程 - 第七章 Java中的13个原子操作类

前言: 当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量 i = 1,A 线程更新 i + 1,B 线程也更新 i + 1,经过两个线程操作之后可能 i 不等于 3,而是等于 2。 因为 A 和 B 线程在更新变量i的时候拿到的 i 都是 1,这就是线程不安全的更新操作,通常我们会使用 synchronized 来解决这个问题,synchronized 会保证多线程不会同时更新变量 i。 而 Java 从 JDK 1.5 开始提供了 java.util.concurrent.

SongYu的博客 1万+

面试必背 Java 多线程面试题

文章目录 一、多线程基础基础知识 1. 并发编程 1.1 并发编程的优缺点 1.2 并发编程的三要素 1.3 并发和并行有和区别 1.4 什么是多线程,多线程的优劣? 2. 线程与进程 2.1 什么是线程与进程 2.2 线程与进程的区别 2.3 用户线程与守护线程 2.4 什么是线程死锁 2.5 形成死锁的四个必要条件 2.6 如何避免死锁 2.7 什么是上下文的切换 3. 创建线程 3.1 创建线程的四种方式 3.2 Runnable接口和Callable接口有何区别 .

a6636656的博客 8349

Java高频面试之并发编程-13

原子性指一个操作不可分割,要么完全执行成功,要么完全不执行,中间状态对其他线程不可见。有序性指程序执行的顺序按代码的先后顺序执行,但编译器和处理器可能重排序指令以提高性能。锁的释放会强制将工作内存刷新到主内存,锁的获取会清空工作内存,从主内存重新加载变量。hello啊,各位观众姥爷们!本baby今天又来报道了!可见性指当一个线程修改共享变量后,其他线程能立即看到修改后的值。强制所有读写直接操作主内存,并通过内存屏障禁止重排序。的非原子性可能导致“写撕裂”(写入半个字)。字段的初始化值对所有线程可见。

牛马baby的博客 1056

Java 并发编程-专栏文章目录汇总

专栏原创出处:github-源笔记文件 ,github-源码 ,转载请附上原文出处链接和本声明。 并发编程-基础概念 Java 内存模型-基础概念 Java 内存模型-顺序一致性 Java 并发编程-CAS实现原理 Java 内存模型-原子操作 Java 内存模型- final 域的内存语义 Java 并发关键字-volatile Java 并发关键字-synchronized Java...

2.wa 4336
上一篇: 12、Java 反射机制详解
下一篇: 14、Java 并发编程进阶:JUC(java.util.concurrent)详解
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值