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
相关文章:
济南企业网站制作公司,济南社保单位网上缴费步骤?
建站之星免费模板:自助建站系统与智能响应式一键生成
建站主机是否等同于虚拟主机?
建站为何优先选择香港服务器?
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
上海网站制作开发公司,上海买房比较好的网站有哪些?
建站之星伪静态规则如何设置?
Python多线程使用规范_线程安全解析【教程】
三星网站视频制作教程下载,三星w23网页如何全屏?
常州企业网站制作公司,全国继续教育网怎么登录?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
西安大型网站制作公司,西安招聘网站最好的是哪个?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
如何选择靠谱的建站公司加盟品牌?
建站之星图片链接生成指南:自助建站与智能设计教程
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
c++怎么用jemalloc c++替换默认内存分配器【性能】
制作宣传网站的软件,小红书可以宣传网站吗?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
建站168自助建站系统:快速模板定制与SEO优化指南
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
宿州网站制作公司兴策,安徽省低保查询网站?
如何用免费手机建站系统零基础打造专业网站?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
,南京靠谱的征婚网站?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
微信小程序 五星评分(包括半颗星评分)实例代码
建站主机选购指南:核心配置优化与品牌推荐方案
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
,制作一个手机app网站要多少钱?
定制建站价位费用解析与套餐推荐全攻略
如何在Windows虚拟主机上快速搭建网站?
h5网站制作工具有哪些,h5页面制作工具有哪些?
香港网站服务器数量如何影响SEO优化效果?
Python路径拼接规范_跨平台处理说明【指导】
TestNG的testng.xml配置文件怎么写
高端云建站费用究竟需要多少预算?
如何快速生成专业多端适配建站电话?
在线制作视频网站免费,都有哪些好的动漫网站?
建站之星与建站宝盒如何选择最佳方案?
*请认真填写需求信息,我们会在24小时内与您取得联系。