Java面试题:如何在Java中实现线程间的通信?请列举几种常见的方式

在Java中,线程间的通信主要涉及到线程间的数据交换和协调。以下是几种常见的线程间通信方式:

  1. 共享对象
    线程可以通过共享对象的实例变量或方法参数来进行通信。这种方式需要特别注意线程安全,通常需要同步代码块或使用锁来避免并发问题。

    public class SharedObject {private int sharedValue;public void setValue(int value) {// 线程安全写入synchronized (this) {sharedValue = value;}}public int getValue() {// 线程安全读取synchronized (this) {return sharedValue;}}
    }
    
  2. wait() 和 notify()/notifyAll()
    Java线程有wait()notify()notifyAll()方法,它们可以用来在线程间进行阻塞和唤醒操作,实现线程间的协调。

    public class Communication {private boolean ready = false;public synchronized void waitForSignal() throws InterruptedException {while (!ready) {wait(); // 等待信号}// 执行后续操作}public synchronized void sendSignal() {ready = true;notifyAll(); // 唤醒所有等待的线程}
    }
    
  3. volatile 关键字
    使用volatile关键字声明的变量可以确保所有线程看到的是最新的值,因为对volatile变量的读写操作不会被缓存在寄存器或其他处理器内部的缓存中。

    public class VolatileCommunication {private volatile boolean flag = false;public void setFlag() {flag = true;}public void checkFlag() {while (!flag) {// 循环检查标志位}}
    }
    
  4. Lock 和 Condition
    java.util.concurrent.locks.Lock接口和java.util.concurrent.locks.Condition接口提供了更高级的锁和条件对象,可以实现复杂的线程间通信。

    Lock lock = new ReentrantLock();
    Condition condition = lock.newCondition();public void awaitCondition() throws InterruptedException {lock.lock();try {while (!某个条件) {condition.await(); // 等待条件成立}// 执行后续操作} finally {lock.unlock();}
    }public void signalCondition() {lock.lock();try {某个条件 = true;condition.signalAll(); // 唤醒所有等待的线程} finally {lock.unlock();}
    }
    
  5. Exchanger
    Exchanger是一个可以在两个线程间交换数据的同步辅助类。当两个线程分别调用exchange()方法时,它们可以交换数据。

    Exchanger<String> exchanger = new Exchanger<>();new Thread(() -> {String fromFirst = "Hello";try {String fromSecond = exchanger.exchange(fromFirst);System.out.println("Received: " + fromSecond);} catch (InterruptedException e) {e.printStackTrace();}
    }).start();
    
  6. BlockingQueue
    java.util.concurrent.BlockingQueue是一个线程安全的队列,可以用于生产者-消费者模式中的线程间通信。

    BlockingQueue<String> queue = new LinkedBlockingQueue<>();new Thread(() -> {try {// 生产者线程queue.put("Item");} catch (InterruptedException e) {e.printStackTrace();}
    }).start();new Thread(() -> {try {// 消费者线程String item = queue.take();System.out.println("Removed: " + item);} catch (InterruptedException e) {e.printStackTrace();}
    }).start();
    
  7. Callable 和 Future
    Callable任务可以返回结果,并且可以抛出异常。通过Future对象,线程可以获取Callable任务的结果。

    ExecutorService executor = Executors.newFixedThreadPool(2);
    Future<Integer> future = executor.submit(() -> {// 执行任务并返回结果return 42;
    });try {Integer result = future.get(); // 等待任务完成并获取结果System.out.println("Task result: " + result);
    } catch (InterruptedException | ExecutionException e) {e.printStackTrace();
    } finally {executor.shutdown();
    }
    

这些线程间通信的方式各有特点和适用场景,开发者可以根据具体的应用需求选择合适的通信机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ios 新安装app收不到fcm推送

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Python库之Playwright简介、安装、使用方法详细攻略

Python库之Playwright简介、安装、使用方法详细攻略 引言 在自动化测试领域&#xff0c;Playwright是一个强大的库&#xff0c;它支持无头浏览器自动化&#xff0c;允许开发者在多种浏览器上进行网页自动化操作。Playwright由微软开发&#xff0c;支持Chromium、Firefox和Web…

拼图游戏完整思路(全代码演示)

主界面 小练习1&#xff1a; 一、三个界面的设置1&#xff1a;创建窗体 1、将三个主界面分开为三个类&#xff0c;每个类都去继承JFrame这个类&#xff0c;使得每个类都可以使用创建页面功能 2、对每个类进行空参构造&#xff0c;在空参构造里面进行窗体属性的赋值 3、创建一个…

苍穹外卖--sky-take-out(二)3-5

sky-take-out&#xff08;一&#xff09;1-2https://blog.csdn.net/kussm_/article/details/138614737?spm1001.2014.3001.5501 第三天 公共字段填充--利用AOP 问题提出 这些字段属于公共字段 &#xff1a;在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间…

蓝桥杯软件测试-十五届模拟赛2期题目解析

十五届蓝桥杯《软件测试》模拟赛2期题目解析 PS 需要第十五界蓝桥杯模拟赛2期功能测试模板、单元测试被测代码、自动化测试被测代码请加&#x1f427;:1940787338 备注&#xff1a;15界蓝桥杯省赛软件测试模拟赛2期 题目1&#xff1a;功能测试题目 1&#xff08;测试用例&…

[极速版]写个linux探测自己机器ip地址的tool(基于shell + sshpass)

适用情况&#xff1a;上级路由ssh or teamviewer访问下级路由的机器&#xff0c;但下级路由不支持查看IP 自行完成端口映射or DMZ整机映射 apt-get install sshpass#!/bin/bash mkdir log for i in $(seq 2 255) dosshpass -p tmp ssh -E err.log -o StrictHostKeyCheckingno …

【解决】Tree prefab at index 8 is missing.

开发平台&#xff1a;Unity 2020 版本以上   问题描述 翻译&#xff1a;树预制体集合中第8位预制体丢失。   解决方法&#xff1a;修复丢失树资产 关联 Unity Terrier 组件使用&#xff0c;前往 树绘制工作区&#xff0c;检查 “树资产” 引用是否丢失&#xff1f;删除或重…

【面试题-013】MyBatis 中,`#` 和 `$` 符号区别

在 MyBatis 中&#xff0c;# 和 $ 符号用于参数替换和表达式。它们在 SQL 语句中用于防止 SQL 注入&#xff0c;并允许动态地插入参数值。 # 符号&#xff08;预编译参数&#xff09;: #{parameter} 用于预编译参数。在 SQL 语句中&#xff0c;#{parameter} 会被 MyBatis 解析…

【C/C++】C++类的六个特殊成员函数,附亲测实例

在C中&#xff0c;类的特殊成员函数是指那些由编译器自动生成的函数&#xff0c;它们在特定情况下会被调用&#xff0c;以支持类的某些操作。这些特殊成员函数包括&#xff1a; 默认构造函数&#xff08;Default Constructor&#xff09;&#xff1a; 当没有提供任何构造函数时…

【C++】C++程序的四个区和智能指针的实现

这篇文章介绍下 C 程序的四个区&#xff0c;以及一个智能指针的简单实现。 起因 最近在公司审查代码的时候&#xff0c;coverity 对以下代码&#xff1a; T fun() {Obj obj;//代码逻辑 }报出了 obj 占用空间过大&#xff0c;有可能栈溢出的问题。 以前从来没有考虑过C的代码…

双指针练习:盛水最多的容器

题目链接&#xff1a;11.盛水最多的容器 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可…

【多模态】34、LLaVA-v1.5 | 微软开源,用极简框架来实现高效的多模态 LMM 模型

文章目录 一、背景二、方法2.1 提升点2.2 训练样本 三、效果3.1 整体效果对比3.2 模型对于 zero-shot 形式的指令的结果生成能力3.3 模型对于 zero-shot 多语言的能力3.4 限制 四、训练4.1 数据4.2 超参 五、代码 论文&#xff1a;Improved Baselines with Visual Instruction …

深入了解 Java 泛型

Java 泛型&#xff08;Generics&#xff09;是 Java SE 5 引入的一个强大特性&#xff0c;它允许你定义类、接口和方法时使用类型参数&#xff0c;从而使代码更加灵活和可重用。本篇博客将详细讲解 Java 泛型的概念、使用方法和注意事项&#xff0c;并通过多个代码示例&#xf…

回溯算法指组合总和

题目&#xff1a; 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 思路&#xff1a; 这种问题…

python编程:SQLite 管理图片数据库

在本博客中&#xff0c;我们将介绍如何使用 wxPython 和 sqlite3 模块构建一个 GUI 应用程序&#xff0c;该程序可以遍历指定文件夹中的所有图片&#xff0c;并将其信息存储到 SQLite 数据库中。 C:\pythoncode\new\InputImageOFFolderTOSqlite.py 项目简介 我们的目标是创建…

【无标题】2024.6.2

2024.6.2 【明霄升海平&#xff0c;飞彩镌流年。】 Sunday 四月廿六 A. 矩形覆盖 题目描述 有N个矩形&#xff0c;矩形的底边边长为1&#xff0c;且均在X轴上&#xff0c;高度给出&#xff0c;第i个矩形的高为h[i]&#xff0c;求最少需要几个矩形才能覆盖这个图形。 例如h […

微信里的东西怎么打印出来呢

随着微信的普及&#xff0c;我们的日常生活和工作都离不开这个强大的社交工具。无论是重要的工作文件、孩子的作业、还是精彩的旅行照片&#xff0c;我们都习惯在微信里保存和分享。但是&#xff0c;当需要将这些微信里的内容打印出来时&#xff0c;很多人可能会感到困惑和麻烦…

2024.05.18 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、实习 | 东风日产2024实习生招聘正式启动 实习 | 东风日产2024实习生招聘正式启动 2、实习 | 达实智能实习生招募令&#xff01; 实习 | 达实智能实习生招募令&#xff01; 3、校招 | …

电力能源指挥中心调度台解决方案主要关注的问题

调度台是指挥中心不可或缺的设备&#xff0c;随着信息化建设的不断深入&#xff0c;电力能源指挥中心已成为重要平台。因此&#xff0c;构建一套高效、智能的电力能源指挥中心调度台解决方案&#xff0c;需要关注以下关键问题&#xff1a; 一、实时监控与数据采集 电力能源指挥…

2.3.2_3 单链表的建立

喜欢《数据结构》部分笔记的小伙伴可以订阅专栏&#xff0c;今后还会不断更新。 此外&#xff0c;《程序员必备技能》专栏和《程序员必备工具》专栏&#xff08;该专栏暂未开设&#xff09;日后会逐步更新&#xff0c;感兴趣的小伙伴可以点一下订阅、收藏、关注&#xff01; 谢…