当前位置: 首页 > wzjs >正文

网站建设 模仿阿里云官网订阅号 小程序

网站建设 模仿阿里云官网,订阅号 小程序,婚庆公司网站制作,全屋定制都包括什么异步与同步的核心区别 同步调用:调用方阻塞等待结果返回异步调用:调用方立即返回,通过回调/轮询等方式获取结果 本文重点讨论如何将异步调用转为同步阻塞模式,以下是五种实现方案: 方法一:使用wait/noti…

异步与同步的核心区别

  • 同步调用:调用方阻塞等待结果返回
  • 异步调用:调用方立即返回,通过回调/轮询等方式获取结果

本文重点讨论如何将异步调用转为同步阻塞模式,以下是五种实现方案:

方法一:使用wait/notify + synchronized

代码示例

 public class ProducerConsumerExample {private static final int BUFFER_SIZE = 5;private final Object lock = new Object();private int[] buffer = new int[BUFFER_SIZE];private int count = 0;// 生产者线程public void produce() throws InterruptedException {int value = 0;while (true) {synchronized (lock) {while (count == BUFFER_SIZE) {System.out.println("缓冲区已满,生产者等待...");lock.wait();}buffer[count++] = value++;System.out.println("生产数据: " + value + ",缓冲区数量: " + count);lock.notify();}Thread.sleep(1000);}}// 消费者线程public void consume() throws InterruptedException {while (true) {synchronized (lock) {while (count == 0) {System.out.println("缓冲区为空,消费者等待...");lock.wait();}int value = buffer[--count];System.out.println("消费数据: " + value + ",缓冲区数量: " + count);lock.notify();}Thread.sleep(1500);}}public static void main(String[] args) {ProducerConsumerExample example = new ProducerConsumerExample();// 启动生产者和消费者线程new Thread(example::produce).start();new Thread(example::consume).start();}}

关键要点

  1. 共享资源保护:通过synchronized(lock)保证线程安全

  2. 条件判断

    • while循环而非if防止虚假唤醒
    • 缓冲区满时生产者等待(wait())
    • 缓冲区空时消费者等待(wait())
  3. 协作机制:每次操作后通过notify()唤醒等待线程

  4. 方法对比

    • notify():唤醒单个等待线程
    • notifyAll():唤醒所有等待线程(适用于多生产者场景)

方法二:使用ReentrantLock + Condition

代码示例

 import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class TestReentrantLock4 {static ReentrantLock lock = new ReentrantLock();static Condition moneyCondition = lock.newCondition();static Condition ticketCondition = lock.newCondition();static boolean haveMoney = false;static boolean haveTicket = false;public static void main(String[] args) throws InterruptedException {// 农民1(等钱)new Thread(() -> {lock.lock();try {while (!haveMoney) {System.out.println("农民1等待资金...");moneyCondition.await();}System.out.println("农民1获得资金,回家!");} finally {lock.unlock();}}, "Farmer1").start();// 农民2(等票)new Thread(() -> {lock.lock();try {while (!haveTicket) {System.out.println("农民2等待车票...");ticketCondition.await();}System.out.println("农民2获得车票,回家!");} finally {lock.unlock();}}, "Farmer2").start();// 主线程模拟发放条件Thread.sleep(1000);lock.lock();try {haveMoney = true;moneyCondition.signal();System.out.println("资金已发放!");haveTicket = true;ticketCondition.signal();System.out.println("车票已发放!");} finally {lock.unlock();}}}

核心特性

  1. 多条件支持

    • 一个锁对象可绑定多个Condition(如moneyCondition/ticketCondition)
  2. 精准唤醒

    • await():释放锁并等待特定条件
    • signal():唤醒满足条件的等待线程
  3. 代码结构

    • 必须在lock.lock()finally unlock()之间操作
    • 条件判断使用while循环防止虚假唤醒

方法三:Future(Callable + ExecutorService)

代码示例

 import java.util.concurrent.*;public class FutureExample {public static void main(String[] args) {ExecutorService executor = Executors.newSingleThreadExecutor();Future<Integer> future = executor.submit(() -> {int sum = 0;for (int i = 1; i <= 100; i++) {sum += i;Thread.sleep(10);}return sum;});System.out.println("主线程执行其他任务...");try {Integer result = future.get(2, TimeUnit.SECONDS);System.out.println("计算结果: 1+2+...+100 = " + result);} catch (TimeoutException e) {System.err.println("计算超时!");future.cancel(true);} catch (Exception e) {e.printStackTrace();} finally {executor.shutdown();}}}

关键API

方法作用
future.get()阻塞获取结果(可设置超时)
future.cancel()取消任务执行
isDone()检查任务是否完成

执行流程

  1. 提交Callable任务到线程池
  2. 主线程继续执行其他操作
  3. 调用future.get()阻塞等待结果
  4. 处理可能出现的异常情况
  5. 最终关闭线程池资源

方法四:CountDownLatch(多线程同步)

代码示例

 import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.TimeUnit;public class CountDownLatchExample {private static final int RUNNERS = 5;private static final CountDownLatch startSignal = new CountDownLatch(1);private static final CountDownLatch readySignal = new CountDownLatch(RUNNERS);public static void main(String[] args) throws InterruptedException {ExecutorService executor = Executors.newFixedThreadPool(RUNNERS);for (int i = 1; i <= RUNNERS; i++) {executor.execute(() -> {try {System.out.println("运动员" + i + "正在准备...");TimeUnit.MILLISECONDS.sleep(300);readySignal.countDown();startSignal.await();System.out.println("运动员" + i + "起跑!");TimeUnit.MILLISECONDS.sleep((long)(Math.random() * 1000));System.out.println("运动员" + i + "到达终点!");} catch (InterruptedException e) {e.printStackTrace();}});}System.out.println("裁判等待运动员就位...");readySignal.await();System.out.println("\n所有运动员就位!");TimeUnit.SECONDS.sleep(1);System.out.println("发令枪响!");startSignal.countDown();executor.shutdown();executor.awaitTermination(5, TimeUnit.SECONDS);System.out.println("\n比赛结束!");}}

应用场景

  1. 多线程初始化后统一执行:如服务启动时等待所有组件就绪
  2. 并发测试控制:模拟固定数量请求同时发起
  3. 事件驱动编程:等待多个前置条件完成

方法五:CyclicBarrier(可重用同步屏障)

代码示例

 import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;public class CyclicBarrierExample {private static final CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("\n===== 进入下一阶段 ====="));public static void main(String[] args) {for (int i = 1; i <= 3; i++) {new Thread(new TeamMember(i)).start();}}static class TeamMember implements Runnable {private int id;public TeamMember(int id) {this.id = id;}@Overridepublic void run() {try {doWork("需求分析", 1000);barrier.await();doWork("开发编码", 1500);barrier.await();doWork("测试部署", 800);barrier.await();} catch (Exception e) {e.printStackTrace();}}private void doWork(String phase, int baseTime) throws InterruptedException {int time = baseTime + (int)(Math.random() * 500);System.out.printf("%s 完成%s(%dms)\n", Thread.currentThread().getName(), phase, time);Thread.sleep(time);}}}

核心特性

对比项CountDownLatchCyclicBarrier
重用性一次性使用可重复触发
线程关系主线程等待子线程子线程相互等待
典型场景线程初始化完成后执行多阶段任务协作

总结对比表

方法适用场景核心机制扩展性
wait/notify简单生产者-消费者模型对象锁的等待/通知机制
ReentrantLock+Condition需要多个条件变量精细条件控制
Future异步任务结果获取任务提交与结果回调
CountDownLatch多线程等待单一事件计数器递减触发机制
CyclicBarrier多阶段任务同步可重置的屏障计数机制

最佳实践建议

  • 简单同步场景优先使用CountDownLatch
  • 需要结果返回时使用Future
  • 多条件或多阶段场景推荐CyclicBarrier
  • 避免使用过时的Object.wait/notify直接控制

文章转载自:

http://vL6CxSKq.mrxgm.cn
http://6X24KfoU.mrxgm.cn
http://HmIWauWR.mrxgm.cn
http://PnxKrfZw.mrxgm.cn
http://LOT6TRdT.mrxgm.cn
http://thlZrCr2.mrxgm.cn
http://ZK7NMauv.mrxgm.cn
http://Uk4tsCFP.mrxgm.cn
http://PChSMPSJ.mrxgm.cn
http://z0EZqFzx.mrxgm.cn
http://mwUxpYAs.mrxgm.cn
http://NSfbYDQ9.mrxgm.cn
http://iX3ruzDk.mrxgm.cn
http://GvBPben6.mrxgm.cn
http://5WKicVmN.mrxgm.cn
http://iJJEMWuI.mrxgm.cn
http://CvDL7JF9.mrxgm.cn
http://t6FRJChv.mrxgm.cn
http://9W6cNjID.mrxgm.cn
http://3Pp1dINP.mrxgm.cn
http://ePjkwtuY.mrxgm.cn
http://SXqOdbmE.mrxgm.cn
http://nrCce6aT.mrxgm.cn
http://eKw6MyaG.mrxgm.cn
http://dipJbdn2.mrxgm.cn
http://RoxCETs8.mrxgm.cn
http://FDpklh7M.mrxgm.cn
http://2RFb3aRq.mrxgm.cn
http://9CJmuOCs.mrxgm.cn
http://471RNTwp.mrxgm.cn
http://www.dtcms.com/wzjs/707711.html

相关文章:

  • 合肥有做网站的吗做网站需要域名吗
  • wordpress外贸网站增加个博客栏网站建设添加文件夹在哪
  • 济源网站建设价格设计网站客户体验
  • 网站建设需要了解哪些信息说做网站被收债
  • wpf可以做网站吗dy刷粉网站推广马上刷
  • 做网推的网站如何创建个人博客wordpress
  • 中国城市建设官方网站域名被墙检测网站
  • 小说网站开发流程具体谷歌在线浏览入口
  • 大型公司为什么做网站网站备案是给什么进行备案
  • 企业网站建设费怎么账务处理长春网站建设phpjz
  • 建设旅游网站目标客户分析外贸企业网站源码
  • 住建综合管理平台怎么自己做网站的优化
  • 邯郸推广公司seo外链发布
  • 网站制作计算机wordpress的主要功能
  • 商丘家居网站建设龙岩做网站的地方有哪些
  • 做网站卖产品要注册公司吗素马网站建设费用差距
  • 手机网站的内容模块北屯网站建设
  • 想做网站怎么跟做网站的公司谈判与传统营销相比网络营销的优势
  • 个人域名可以备案企业网站吗网站开发公司团队优势
  • 深圳网站运营中山网站制作费用
  • 吴江市建设局网站百度收录网站要多久
  • 免费用搭建网站免费网站注册 建站
  • 有那种做订单的网站吗网络推广公司网站
  • 企业网站的建设水平直接关系到网络营销的效果闵行区教育局官网
  • 像聚美网站建设费用做平台是做网站和微信小程序的好别
  • 网站页面禁止访问wordpress 国内视频网站
  • 壹佰网站建设产品设计培训
  • 白酒类网站模板沈阳成创网站建设公司
  • 湛江企业网站建站模板企业网站属于下面哪种媒体类型
  • 网站开发中使用框架吗logo商标设计公司