进程与线程通信方式

线程和进程的概念及其通信、同步方式 1、线程 1.1、线程的基本概念 线程是进程中执行运算的最小单位,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。 1.2、使用线程的好处 (1)易于调度; (2)多线程可提高并发性:通过线程可方便有效地实现并发性,进程可创建多... 阅读详情

一、进程间通信(IPC)方法

在 Java 中,由于跨平台特性,部分 IPC 方式需要借助 JNI 或第三方库。以下是各方法的 Java 实现方案:

通信方式Java 实现方案典型场景
管道(Pipe)PipedInputStream / PipedOutputStream
ProcessBuilder 结合 Runtime.exec()
父子进程通信、Shell 命令链
信号(Signal)sun.misc.Signal(不建议)
ShutdownHook 处理进程终止
优雅停机、资源清理
消息队列RocketMQ / RabbitMQ / Kafka
或 JNI 调用 POSIX MQ
分布式系统解耦
共享内存MappedByteBuffer(FileChannel.map)
或 DirectByteBuffer + JNI
高性能数据传输
信号量Semaphore(仅限线程)
跨进程需用 FileLock 或第三方库
资源访问控制
套接字(Socket)Socket / ServerSocket(TCP)
DatagramSocket(UDP)
UnixDomainSocket(Java 16+)
网络通信、RPC

二、Java 线程间通信(ITC)核心机制

1. 锁机制(Lock)
锁类型Java 实现特点适用场景
互斥锁synchronized / ReentrantLock排他性访问大多数同步场景
读写锁ReentrantReadWriteLock读共享、写互斥读多写少
自旋锁AtomicBoolean + CAS 循环无上下文切换锁持有时间极短
乐观锁AtomicInteger / LongAdder无锁并发计数器、统计数据
// 1. synchronized(最常用)
public synchronized void safeMethod() {
    // 临界区
}

// 2. ReentrantLock(更灵活)
Lock lock = new ReentrantLock();
lock.lock();
try {
    // 临界区
} finally {
    lock.unlock();
}

// 3. ReentrantReadWriteLock(读多写少)
ReadWriteLock rwLock = new ReentrantReadWriteLock();
rwLock.readLock().lock();  // 读锁
rwLock.writeLock().lock(); // 写锁

// 4. 自旋锁(AtomicBoolean)
AtomicBoolean flag = new AtomicBoolean(false);
while (!flag.compareAndSet(false, true)) {
    // 自旋等待
}
2. 条件变量(Condition)

与 ReentrantLock 配合,实现 wait/notify 的增强版:

// 生产者-消费者经典实现
class BoundedBuffer {
    private final Lock lock = new ReentrantLock();
    private final Condition notFull = lock.newCondition();
    private final Condition notEmpty = lock.newCondition();
    private final Object[] items = new Object[10];
    private int putptr, takeptr, count;

    public void put(Object x) throws InterruptedException {
        lock.lock();
        try {
            while (count == items.length) {
                notFull.await();  // 队列满,等待
            }
            items[putptr] = x;
            if (++putptr == items.length) putptr = 0;
            count++;
            notEmpty.signal();  // 唤醒消费者
        } finally {
            lock.unlock();
        }
    }

    public Object take() throws InterruptedException {
        lock.lock();
        try {
            while (count == 0) {
                notEmpty.await();  // 队列空,等待
            }
            Object x = items[takeptr];
            if (++takeptr == items.length) takeptr = 0;
            count--;
            notFull.signal();  // 唤醒生产者
            return x;
        } finally {
            lock.unlock();
        }
    }
}
3. synchronized + wait/notify(基础版)
// 使用 synchronized 内置锁的等待通知
synchronized (lock) {
    while (condition) {
        lock.wait();  // 释放锁并等待
    }
    // 执行操作
    lock.notify();  // 唤醒一个等待线程
}
4. 线程局部存储(TLS)
// ThreadLocal - 每个线程独立副本
public class UserContext {
    private static final ThreadLocal<Long> currentUserId = new ThreadLocal<>();
    
    public static void setUserId(Long userId) {
        currentUserId.set(userId);
    }
    
    public static Long getUserId() {
        return currentUserId.get();
    }
    
    public static void clear() {
        currentUserId.remove();  // 防止内存泄漏
    }
}

// 使用 InheritableThreadLocal 传递上下文给子线程
InheritableThreadLocal<String> context = new InheritableThreadLocal<>();
context.set("parent-data");
new Thread(() -> System.out.println(context.get())).start(); // 子线程可继承
5. 信号量(Semaphore)
// 控制并发访问数(如连接池)
Semaphore semaphore = new Semaphore(3);  // 最多3个并发

public void accessResource() {
    try {
        semaphore.acquire();  // 获取许可,阻塞
        // 访问资源
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } finally {
        semaphore.release();  // 释放许可
    }
}

// tryAcquire - 非阻塞版本
if (semaphore.tryAcquire(1, TimeUnit.SECONDS)) {
    // 获取成功
} else {
    // 超时处理
}
6. 阻塞队列(BlockingQueue)

Java 并发包提供了丰富的线程安全队列:

// 最常用的无界队列
BlockingQueue<String> queue = new LinkedBlockingQueue<>();

// 有界队列(避免内存溢出)
BlockingQueue<String> boundedQueue = new ArrayBlockingQueue<>(100);

// 延迟队列(延时任务)
DelayQueue<DelayedTask> delayQueue = new DelayQueue<>();

// 生产者-消费者模式
class Producer implements Runnable {
    private final BlockingQueue<String> queue;
    public void run() {
        queue.put("data");  // 阻塞直到有空间
    }
}

class Consumer implements Runnable {
    private final BlockingQueue<String> queue;
    public void run() {
        String data = queue.take();  // 阻塞直到有数据
    }
}
7. CompletableFuture(异步编程)
// 异步任务链
CompletableFuture<String> future = CompletableFuture
    .supplyAsync(() -> fetchUserData())      // 异步执行
    .thenApply(data -> processData(data))    // 转换结果
    .thenAccept(result -> System.out.println(result))
    .exceptionally(ex -> {
        System.err.println("Error: " + ex);
        return null;
    });

// 等待多个任务完成
CompletableFuture.allOf(task1, task2, task3).join();

三、进程与线程通信对比(Java 视角)

对比维度进程间通信(IPC)线程间通信(ITC)
内存模型不同进程独立内存空间同一进程共享堆内存
数据共享需 IPC 机制(Socket、共享内存)直接访问共享对象
Java 实现ProcessBuilder / Socket / MappedByteBuffersynchronized / volatile / BlockingQueue
性能开销较高(内核态切换、数据拷贝)较低(用户态操作)
容错性进程崩溃互不影响线程崩溃导致整个 JVM 终止
同步复杂度共享内存需要额外同步(FileLock)必须严格同步,否则出现竞态条件
分布式能力支持跨机器通信(Socket)仅限单个 JVM 内部

四、性能对比一览

通信方式延迟(约)吞吐量适用场景
共享内存(MappedByteBuffer)极低(~100ns)极高(GB/s)高性能数据传输
Unix Domain Socket低(~1μs)高(MB/s)本地进程通信
TCP Socket中(~10μs)中网络通信
管道(PipedStream)中(~1μs)中父子线程通信
消息队列(MQ)高(~1ms)低分布式解耦
BlockingQueue低(~100ns)高线程间数据缓冲
进程、线程、协程 进程间的通信方式 IO多路复用的方式 进程: 进程是系统进行资源分配和调度的⼀个独立单位,一个程序在一个数据集中的一次动态执行过程,可以简单理解为“正在执行的程序”。 进程一般由程序、数据集、进程控制块三部分组成 程序用来描述进程要完成哪些功能以及如何完成; 数据集则是程序在执行过程中所需要使用的资源; 进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志; 进程的局限是创建、撤销和切换的开销比较大 线程: 线程是进程的⼀个实体, 也叫轻量级进程,是CPU调度和分派的基本单位, 阅读详情

相关推荐

用nTopology五分钟生成三维Voronoi泡沫:节点式建模从原理到实操

多孔结构在增材制造与轻量化设计中应用广泛,其中Voronoi泡沫因其优异的缓冲吸能和比刚度表现备受关注。传统CAD建模需处理复杂布尔运算和网格修复,而隐式建模通过数学场描述几何体,将空间距离与密度分布转化为可视化节点,大幅降低操作门槛。nTopology基于场驱动与参数化逻辑,无需编写命令,即可实时调节胞元尺寸、壁厚及随机种子,快速生成可打印的泡沫实体。这种工作流适用于缓冲垫、医疗植入体、航空支架等场景,也为梯度密度结构与力学仿真验证提供了高效路径。本文围绕三维Voronoi泡沫的生成原理与节点操作流程,详

weixin_26767391的博客 155

进程间通信和线程间通信的几种方式

进程和线程的区别: 对于进程来说,子进程是父进程的复制品,从父进程那里获得父进程的数据空间,堆和栈的复制品。 而线程,相对于进程而言,是一个更加接近于执行体的概念,可以和同进程的其他线程之间直接共享数据,而且拥有自己的栈空间,拥有独立序列。 共同点: 它们都能提高程序的并发度,提高程序运行效率和响应时间。线程和进程在使用上各有优缺点。 线程执行开销比较小,但不利于资源的管理和保护,而进程相反...

Harry的博客 2万+

微信DAT图片恢复全攻略:从文件路径到批量解密(附最新工具下载)

本文详细介绍了微信DAT图片恢复的全过程,从文件路径定位到批量解密操作,帮助用户高效恢复加密存储的图片。文章涵盖新旧版本微信的存储结构差异,推荐使用专业解密工具进行批量转换,并提供了提升恢复成功率的实用技巧和常见问题解决方案。

weixin_29325007的博客 455

进程之间的通信方式、线程之间的通信方式

进程和线程之间的通用方式

水w的博客 1896

ArcGIS拓扑面错误批量修改

在工作学习中经常会遇到拓扑修改的问题,当数据量巨大的时候会产生拓扑问题 当拓扑错误数量巨大时,人工逐一修改是不现实的,基于此利用gis自带工具箱实现拓扑面类错误的批量修改。 一、.常见拓扑错误的类型: 1面重叠 2空隙(绿色部分) 二、拓扑检查 1新建数据库-----新建数据集—导入数据. 2新建拓扑 3修改拓扑容差及名称 添加拓扑修改规则 完成拓扑检查-查看拓扑错误 三、拓扑批量...

qq_43173805的博客 3万+

产生式系统的完整示例——医疗诊断系统(附python代码)

发烧(Fever)、咳嗽(Cough)、皮疹(Rash)、喉咙痛(SoreThroat)、头痛(Headache)、流涕(RunnyNose)、呼吸困难(ShortnessOfBreath)、白细胞计数高(HighWBC)、接触流感患者(ContactFlu)、接触麻疹患者(ContactMeasles)。(2)若规则库中存在尚未使用过的规则,而且它的前提(前件)可与综合数据库中的已知事实匹配,则转第(3)步;(3)执行当前选中的规则,并对该规则做上标记,把该规则执行后得到的结论送入综合数据库中。

搏博的专栏 1704

进程与线程的区别以及通信方式

进程和线程的区别定义资源拥有创建开销通信方式上下文切换独立性操作系统支持应用场景进程: 应用程序运行实例线程: 程序执行的最小单位进程: 独立内存空间线程: 共享内存资源进程: 大线程: 小进程: IPC机制线程: 共享内存进程: 大线程: 小进程: 高线程: 低进程: 独立地址空间线程: CPU时间片进程: 大资源消耗线程: 高并发 定义:资源拥有:创建开销:通信方式:上下文切换:独立性:操作系统支持:应用场景:理解进程和线程的区别对于编写高效、稳定的应用程序非常重要。在多任务操作系统中,进程和线程的

ZY52678的博客 971

【Claude】Extra inputs are not permitted 错误:代理剥离 Beta 标头的解决方案 bug报错已解决

深入分析Claude Code Extra inputs are not permitted 400错误的技术原理,解析代理剥离Beta标头的根因与多种修复方案。

一键难忘的博客 149

进程、线程、协程的对比、区别和联系,进程之间的通信方式、线程之间的通信方式、协程之间的通信方式

学习了进程、线程协程的通信等

Ws_Te47的博客 1612

基于C#开发ABB机器人上位机系统:从操作控制到数据交互的全方位实现

ABB工业机器人是世界领先的自动化设备之一,广泛应用于焊接、装配、搬运、喷涂、包装等多个行业。机器人控制器:用于控制机器人运动、路径规划、状态监控等。上位机系统:提供人机交互界面,允许操作员与机器人进行交互,实现实时控制、参数调整和数据分析。上位机系统通过与机器人控制器通信,采集机器人状态数据,发送控制指令,实现远程监控和控制操作。通过高效的操作界面和数据交互,可以大大提高机器人的工作效率和系统的可维护性。基于C#开发ABB机器人上位机系统,能够实现高效的机器人控制与实时数据交互。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1180

读懂 403 Forbidden, the request has been blocked by UCON.:它不是浏览器渲染问题,而是后端安全闸门在拦截

摘要 403 Forbidden 错误表明服务器理解请求但拒绝执行,通常与权限或访问控制有关。当错误信息显示 "blocked by UCON" 时,说明请求被 SAP 体系中的统一连接管控框架拦截。UCON 采用白名单机制限制外部调用,通过记录、评估、强制三阶段流程实施管控。常见触发场景包括 HTTP 服务与通信场景配置不一致、白名单未更新等。排查时应通过 DevTools 确认服务器响应,使用 curl 排除浏览器干扰,并比较不同环境的行为差异。解决方案通常涉及调整配置传输顺序或更新

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 242

进程与线程的区别,进程间通信方式,线程间通信方式

进程与线程的区别进程的通信方式线程的通信方式2011-03-15 01:04 进程与线程的区别: 通俗的解释 一个系统运行着很多进程,可以比喻为一条马路上有很多马车 不同的进程可以理解为不同的马车 而同一辆马车可以有很多匹马来拉–这些马就是线程 假设道路的宽度恰好可以通过一辆马车 道路可以认为是临界资源 那么马车成为分配资源的最小单位(进程) 而同一个马车被很多匹马驱动(线程)–即最小的运行单位 ...

qq_16432191的博客 642

深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能

大家好,我是微学AI,今天给大家介绍一下深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能。在去年ChatGPT的发布后,各种国内外的大语言模型层出不穷涌现,但是大家都知道现在的模型的诟病的数学能力不足,就算是简单的数学题都可能算错,今天我就来给大家引入MathGPT的模型,用来解决GPT解决数学问题,对于简单的初中数学高中数学都可以解决,让数学问题精准答题得到实现。

微学AI的博客 1651

进程、线程与协程的区别及通信方式

本文比较了进程、线程和协程的核心区别及通信方式。进程是资源分配的基本单位,拥有独立内存空间;线程是CPU调度的基本单位,共享进程内存;协程则是用户态轻量级线程,切换开销最小。通信方式方面:进程间通过管道、共享内存等IPC机制;线程间通过共享变量和同步原语;协程间多采用通道或事件循环。三种模型各有优劣,进程隔离性强但开销大,线程并发性中等,协程适合高并发I/O场景。实际应用中常组合使用这些模型以达到最佳性能。

weixin_39956506的博客 682

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

进程与线程及其通信方式

多线程:在同一个进程中同时运行多个线程,CPU在瞬间不断切换去处理各个线程,可以理解成多个线程在抢CPU资源。无名管道:半双工,数据只能单向流动,且只能在具有亲缘关系的进程间使用。有名管道:半双工,数据只能单向流动,允许在没有亲缘关系的进程间使用。4、共享内存:映射一段能被其他进程所访问的内存,由一个进程创建,多个进程都可以访问。线程A与线程B在同一个进程中,故A可以调用此函数来请求取消B,操作成功,则返回0.P操作:申请临界资源,wait():线程标识符,不由用户指定,是pthread_t的实例化对象。

m0_47669787的博客 720

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

进程与线程的区别和通信方式

线程与进程的区别 1.进程是资源分配的最小单位,线程是程序执行的基本单位(任务调度和执行) 2.进程有自己的独立地址空间,每启动一个进程,系统都会为其分配地址空间,线程是共享进程中的数据的,使用相同的地址空间,所以线程的产生快,通讯快,切换快,资源利用率好 3.线程中的通信更加方便,同一个进程下的线程共享全局变量,静态变量,线程在使用公共变量或者内存时要使用同步机制但进程不用 4.多进程程序比较健壮,而多线程程序只要有一个线程死掉,整个进程也死掉,但是进程有自己独立的地址空间,一个进程死掉不会对别的进程造成

qq_46142259的博客 1337

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

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

进程与线程的区别及通信方式探索

在操作系统和并发编程的广阔领域中,进程(Process)和线程(Thread)是两个核心概念。它们各自承担着不同的角色,并在不同的场景下发挥着关键作用。本文将深入探讨进程与线程的区别,以及它们之间的通信方式。

hs_1024的博客 1046

进程、线程间通信方式

进程由线程组成 ——> 进程有的功能线程都有,所以线程的通信方式要多一些。

Yangyeon_的博客 2251

进程和线程的几种通信方式

进程之间通信的几种方式和线程之间的通信方式,以及Java中创建多线程的几种方式

weixin_40701758的博客 7430

进程与线程的区别 进程的通信方式 线程的通信方式

进程与线程的区别进程的通信方式线程的通信方式 进程与线程的区别: 通俗的解释 一个系统运行着很多进程,可以比喻为一条马路上有很多马车 不同的进程可以理解为不同的马车 而同一辆马车可以有很多匹马来拉--这些马就是线程 假设道路的宽度恰好可以通过一辆马车 道路可以认为是临界资源 那么马车成为分配资源的最小单位(进程) 而同一个马车被很多匹马驱动(线程)--即最小的运行单位 每辆马车

直到世界的尽头 2586

进程、线程、协程、通信方式

文章目录进程线程协程进程、线程、协程的区别概念进程、线程共同点进程、线程不同点线程、协程比较通信方式之间的差异进程通信管道(pipe)有名管道 (namedpipe)信号量(semaphore)消息队列(messagequeue)信号 (sinal)共享内存(shared memory)套接字(socket)线程间的通信方式锁机制:包括互斥锁、条件变量、读写锁信号量机制(Semaphore)信号机制(Signal) 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源

HTZW的博客 852

进程间的几种通信方式的比较和线程间的几种通信方式

近日想总结下进程间,线程间的通信方式,在网上搜索了下,感觉写的很好,照搬过来,当做加深记忆。 几种进程间的通信方式 (1) 管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有血缘关系的进程间使用。进程的血缘关系通常指父子进程关系。 (2)有名管道(named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信。 (3)信号量(semopho

ykc的专栏 3万+

进程、线程之间的通信方式

一、进程间的通信方式 管道( pipe ) 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 调用pipe函数,会在内核中开辟出一块缓冲区用来进行进程间通信,这块缓冲区称为管道,它有一个读端和一个写端。 pipe函数接受一个参数,是包含两个整数的数组,如果调用成功,会通过pipefd[2]传出给用户程序两个文件描述符,需要注意pipefd[0]指向管道的读端, pipefd [1]指向管道的写端,那么此时这个管...

lianggx3的博客 1946

进程线程通信方式

linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信...

自由 自信 不失望 362

进程间的通信方式以及多线程和多进程之间的区别

一.两者区别 (1)多进程 1.数据是分开的,共享复杂,同步简单 2.占用内存多,切换复杂,CPU利用率低 3.创建销毁复杂,切换复杂,速度慢 4.编程简单,调试简单 5.进程间不会相互影响 6.适应于多核、多机分布 ;如果一台机器不够,扩展到多台机器比较简单 (2)多线程 1.多线程共享进程数据,共享简单,同步复杂 2.占用内存少,切换简单,CPU利用率高 3.创建销毁简单,切换简单,速度...

HU1656的博客 1032

linux系统线程通信的几种方式,Linux的进程/线程通信方式总结

Linux系统中的进程通信方式主要以下几种:同一主机上的进程通信方式* UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal)* System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue),和共享内存(Shared Memory)网络主机间的进程通信方式* RPC: Remote Procedure Call ...

weixin_42300099的博客 2757
上一篇: Brian Kernighan 算法
下一篇: Map的遍历方式
xuhaoyu_cpp_java
博客等级 码龄2年 2粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值