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

Java中同步和异步的区别,以及阻塞和非阻塞的区别

一、同步 vs 异步

同步(Synchronous)

  • 调用者主动等待结果
  • 结果没回来,调用者不能做下一件事(必须排队)

异步(Asynchronous)

  • 调用者不等结果
  • 把任务交给别人执行,自己继续干别的

📌 同步/异步的本质:看调用者是否“等待结果”。


二、阻塞 vs 非阻塞

阻塞(Blocking)

  • 线程停在这里,啥也干不了
  • 线程被“卡住”等待资源或事件

非阻塞(Non-blocking)

  • 线程不会被卡住
  • 如果得不到结果会马上返回,不会停下来等

📌 阻塞/非阻塞本质:看线程有没有被卡住。


✔ 同步 vs 异步:“调用方要不要等结果”
✔ 阻塞 vs 非阻塞:线程在等的时候是否被卡住

三、四种组合

组合是否等待结果(同步/异步)线程是否被卡住(阻塞/非阻塞)
同步阻塞卡住
同步非阻塞不卡住(轮询)
异步阻塞不等卡住(几乎不用)
异步非阻塞不等不卡住(最优秀)

四、使用代码演示每一种情况


1. 同步阻塞(Synchronous Blocking)

📌 最常见、最容易理解
调用 getData(),要等结果返回才继续往下执行。

public String getData() {// 假设这里访问网络,需要 3 秒Thread.sleep(3000);return "数据";
}public void demo() {System.out.println("开始");String result = getData(); //  同步 + 阻塞:卡住等结果System.out.println("结果: " + result);System.out.println("结束");
}

执行顺序:

开始
(线程卡住 3 秒)
结果: 数据
结束

2. 同步非阻塞(Synchronous Non-blocking)

📌 调用者会持续检查结果,但线程不被卡住
常见于"轮询"。

private volatile String result = null;public void request() {// 模拟后台线程处理new Thread(() -> {try {Thread.sleep(3000);result = "后台完成";} catch (Exception e) {}}).start();
}public void demo() {System.out.println("开始");request(); // 发出任务//  同步非阻塞:不被卡住,但必须自己循环检查(轮询)while (result == null) {System.out.println("我在等,但我没被卡住...");try { Thread.sleep(200); } catch (Exception e) {}}System.out.println("结果: " + result);System.out.println("结束");
}

3. 异步阻塞(Asynchronous Blocking)

📌 这种情况很少用,但理论上存在
调用异步任务,但最终仍然调用 get() 阻塞等待。

public void demo() throws Exception {ExecutorService executor = Executors.newSingleThreadExecutor();Future<String> future = executor.submit(() -> {Thread.sleep(3000);return "数据";});System.out.println("开始");//  异步提交任务//  但是这里用 get() 阻塞住了String result = future.get(); // 异步 + 阻塞System.out.println("收到: " + result);executor.shutdown();
}

4. 异步非阻塞(Asynchronous Non-blocking)

📌 最优秀的模式

  • 调用不会等待
  • 线程不会被卡住
  • 结果通过回调、事件、消息通知回来
public void asyncGetData(Consumer<String> callback) {new Thread(() -> {try {Thread.sleep(3000);callback.accept("数据");} catch (Exception e) {}}).start();
}public void demo() {System.out.println("开始");//  异步非阻塞:不用等,不阻塞线程asyncGetData(result -> {System.out.println("回调收到: " + result);});System.out.println("我可以继续干别的事情");
}

输出顺序:

开始
我可以继续干别的事情
(3 秒后)
回调收到: 数据

五、总结

概念定义
同步调用者等待结果
异步调用者不等待结果
阻塞当前线程停住、不能干其他事
非阻塞当前线程不会停住

📌 同步/异步 = 逻辑上的等待
📌 阻塞/非阻塞 = 线程状态是否被卡住

http://www.dtcms.com/a/590440.html

相关文章:

  • 电子商务网站建设问题公司网站制作知乎
  • 科研人如何使用ubantu服务器
  • o2o网站建设手机网站大全123456
  • 【Web安全】JeecgBoot框架SRC高频漏洞分析总结
  • 花都微网站建设北京网站制作出名 乐云践新
  • 路径总和(C)
  • 网站模版怎么样网站内容一样影响收录
  • 网站开发怎么接入支付宝中山企业网站的建设
  • 做网站参考文献河北网站建设价格低
  • 天河建设网站报价网页打不开qq可以上qq
  • 郑州网站推广电话wordpress发布文章 自定义栏目
  • 深圳市住房和城乡建设局网站首页静态网站建设背景
  • 做编程的网站有哪些大航母网站建设案例
  • 青岛制作企业网站百度信誉任何在网站展示
  • 深入浅出 Ascend C:新一代算子开发接口 Aclnn 原理解析与实践
  • 山西省洪涝灾害应急物资体系优化研究 - 核心章节建模与算法实施方案
  • 做生物学的网站平板室内装修设计软件
  • 为什么要建设个人网站网站建设优惠活动
  • 八.Docker-compose容器编排-生产环境用Kubernetes替代
  • ComfyUI高级应用之图片放大
  • 编程的网站免费外链网站
  • 网站开发的经费预算免费发布信息网站平台
  • 郑州那个公司做网站好福州自助建站
  • 昆山建设银行交学费的网站公众号推文模板
  • 河南企业网站优化电商网站设计企业
  • python 根据坐标将图片进行裁图
  • 四川省安监站网址安庆网站建设推荐秒搜科技
  • 烟台网站建设的方法有哪些wordpress主播主题
  • 网站集约化建设讲话稿网页设计图片位置怎么设置
  • 清远住房和城乡建设部网站wordpress权限ip