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失败任务处理与监控  手机网站制作与建设方案,手机网站如何建设?