java 同步、异步、阻塞和非阻塞分析
发布时间 - 2026-01-10 22:57:36 点击率:次java 同步、异步、阻塞和非阻塞分析

概要:
正常情况下,我们的程序以同步非阻塞的方式在运行。但是我们的程序总会出现一些耗时操作,比如复杂的计算(找出1到10亿之间的素数)和程序本身无法控制的操作(IO操作、网络请求)。包含这些耗时操作的方法我们可以把它称为阻塞方法,包含这些耗时操作的任务我们可以把它称为阻塞任务。阻塞与非阻塞是以是否耗时来定义的。
如果程序中存在大量阻塞操作,就会影响程序性能。但是阻塞的存在是客观事实,我们的程序是无法改变它的,一个网络请求需要3秒才能响应,我们不可能让它1毫秒就能响应,因为接受请求的服务器可能完全不由我们控制。但是我们可以改变处理阻塞的方式——以异步的方式处理阻塞任务。实现异步的主要技术就是多线程。图示:
同步和异步是个时序概念。同步就是同时只执行一个任务,而异步则是同时执行多个任务。
代码示例
模拟网络请求:
package com.zzj.asyn;
public class HttpRequest {
private Callable callable;
public HttpRequest(Callable callable) {
this.callable = callable;
}
public void send(){
// 模拟网络请求
try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
// 回调
this.callable.call("Hello world!");
}
public interface Callable{
void call(String result);
}
}
以同步方式处理阻塞任务:
package com.zzj.asyn;
import com.zzj.asyn.HttpRequest.Callable;
/**
* 以同步的方式处理阻塞任务
* @author lenovo
*
*/
public class App {
public static void main(String[] args) {
new HttpRequest(new Callable() {
@Override
public void call(String result) {
System.out.println("Thread:" + Thread.currentThread().getName());
System.out.println("Message from remote server:" + result);
}
}).send();
System.out.println("Thread " + Thread.currentThread().getName() + " is over!");
}
}
结果:
Thread:main Message from remote server:Hello world! Thread main is over!
以异步的方式处理阻塞任务:
package com.zzj.asyn;
import com.zzj.asyn.HttpRequest.Callable;
/**
* 以异步的方式处理阻塞任务
* @author lenovo
*
*/
public class App2 {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
new HttpRequest(new Callable() {
@Override
public void call(String result) {
System.out.println("Thread:" + Thread.currentThread().getName());
System.out.println("Message from remote server:" + result);
}
}).send();
}
}).start();
System.out.println("Thread " + Thread.currentThread().getName() + " is over!");
}
}
结果:
Thread main is over! Thread:Thread-0 Message from remote server:Hello world!
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java
# 同步、异步、阻塞和非阻塞
# 同步、异步、阻塞和非阻塞详解几简单实例
# 简述JAVA同步、异步、阻塞和非阻塞之间的区别
# java 中同步、异步、阻塞和非阻塞区别详解
# 详解socket阻塞与非阻塞
# 同步与异步、I/O模型
# 浅谈socket同步和异步、阻塞和非阻塞、I/O模型
# 科学知识:同步、异步、阻塞和非阻塞区别
# 一篇文章理解阻塞、非阻塞、同步、异步
# 我们可以
# 把它
# 就会
# 是个
# 不可能
# 就能
# 多个
# 则是
# 希望能
# 总会
# 让它
# 谢谢大家
# 回调
# 多线程
# 与非
# 情况下
# HttpRequest
# asyn
# public
# private
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
Laravel如何配置和使用缓存?(Redis代码示例)
网站图片在线制作软件,怎么在图片上做链接?
如何用腾讯建站主机快速创建免费网站?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
Laravel怎么为数据库表字段添加索引以优化查询
如何确保西部建站助手FTP传输的安全性?
如何用JavaScript实现文本编辑器_光标和选区怎么处理
高端网站建设与定制开发一站式解决方案 中企动力
电商网站制作价格怎么算,网上拍卖流程以及规则?
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
开心动漫网站制作软件下载,十分开心动画为何停播?
网站制作壁纸教程视频,电脑壁纸网站?
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
如何在阿里云虚拟服务器快速搭建网站?
php 三元运算符实例详细介绍
网站建设整体流程解析,建站其实很容易!
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
JavaScript如何实现倒计时_时间函数如何精确控制
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
如何在IIS7中新建站点?详细步骤解析
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
如何在Windows 2008云服务器安全搭建网站?
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
Laravel如何使用Eloquent进行子查询
浅述节点的创建及常见功能的实现
高性能网站服务器部署指南:稳定运行与安全配置优化方案
android nfc常用标签读取总结
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
如何在腾讯云服务器上快速搭建个人网站?
微信h5制作网站有哪些,免费微信H5页面制作工具?
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
Laravel如何实现事件和监听器?(Event & Listener实战)
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
深圳网站制作的公司有哪些,dido官方网站?
个人摄影网站制作流程,摄影爱好者都去什么网站?
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
手机网站制作与建设方案,手机网站如何建设?
上一篇: 网站制作类型,网络产品的分类?
上一篇: 网站制作类型,网络产品的分类?

