今天看到AJAX(异步加载)感觉怪怪的!!!
怪就怪在 异步 两个字上!

问题

、异步和多线程有什么区别?
其实,异步是目的,而多线程是实现这个目的的方法。异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作就没有必要异步了),B可以继续自顾自的处理它自己的事儿,不用干等着这个耗时操作返回。
、随着拥有多个硬线程CPU(超线程、双核)的普及,多线程和异步操作等并发程序设计方法也受到了更多的关注和讨论。

多线程和异步操作的异同

多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别。

异步操作的本质

所有的程序最终都会由计算机硬件来执行。

线程的本质

线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。

异步操作的优缺点

因为异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完全不用,最起码可以减少 共享变量的数量),减少了死锁的可能。当然异步操作也并非完美无暇。编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与普通人的思维方式有些差异,而且难以调试。

多线程的优缺点

多线程的优点很明显,线程中的处理程序依然是顺序执行,符合普通人的思维习惯,所以编程简单。但是多线程的缺点也同样明显,线程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现。

而线程的适用范围则是那种需要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。但是往 往由于使用线程编程的简单和符合习惯,所以很多朋友往往会使用线程来执行耗时较长的I/O操作。这样在只有少数几个并发操作的时候还无伤大雅,如果需要处 理大量的并发操作时就不合适了。

异步调用与多线程

异步调用并不是要减少线程的开销, 它的主要目的是让调用方法的主线程不需要同步等待在这个函数调用上, 从而可以让主线程继续执行它下面的代码.与此同时, 系统会通过从ThreadPool中取一个线程来执行,帮助我们将我们要写/读的数据发送到网卡.由于不需要我们等待, 我们等于同时做了两件事情. 这个效果跟自己另外启动一个线程来执行等待方式的写操作是一样的.但是, 异步线程可以利用操作系统/.Net的线程池, 系统可以根据吞吐量动态的管理线程池的大小.

异步与多线程:

从辩证关系上来看,异步和多线程并不时一个同等关系,异步是目的,多线程只是我们实现异步的一个手段.

什么是异步:

异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回.实现异步可以采用多线程技术或则交给另外的进程来处理

线程池的实现方法与线程是不一样的.初始化时在线程池里的线程为0.当进程需要一个线程时,创建一个线程,由此线程执行用户的方法.需要注意的是,此线程执行完后并不立即销毁,而是挂起等待,如果有其他方法需要执行,回唤醒进行处理.只有当它等到几秒还没有任务执行时才唤醒自己,并销毁自己,释放资源.当然,如果线程池中的线程不够处理任务时,会再次创建一个新线程进行执行.

异步有的时候用普通的线程,有的时候用系统的异步调用功能。有一些IO操作也是异步的,但是未必需要一个线程来运行。例如:硬件是有DMA功能的,在调用DMA传输数据的时候,CPU是不需要执行处理的,只需要发起传输和等待传输结束即可。具体到.net平台,比如Socket的BeginSend,如果是运行在Windows 2000以后的平台,在底层就会调用异步的完成端口来发送。

异步执行也得执行:

不在当前线程执行,当然得去另外一个线程执行。异步通常用系统线程池的线程,通常情况下性能好些。(因为可以多次利用,申请时不需要重新申请一个线程,只需要从池里取就行了。)异步是一种效果,多线程是一种具体技术。可以说,用“多线程”实现“异步”。

异步和多线程是两个不同的概念:

不能这样比较.异步请求一般用在IO等耗时操作上,他的好处是函数调用立即返回,相应的工作线程立即返还给系统以供重用。由于系统的线程资源是非常宝贵的,通常有一定的数目限制,而如果用同步方式,那么每个请求都自始至终占用这一个线程,服务器可以同时服务的请求数就少了。当异步操作执行完成后,系统会从可用线程中选取一个执行回调程序,这时的这个线程可能是刚开始发出请求的那个线程,也可能是其他的线程,因为系统选取线程是随机的事情,所以不能说绝对不是刚开始的那个线程。多线程是用来并发的执行多个任务。

不过有个问题,异步有时优先级比主线程还高。这个特点和多线程不同。

使用场景:

进本在于一个无关紧要的, 耗时的****漫长查询中,因为耗时原因用户请求进来不可能把时间浪费在过长时间来加载你无关紧要的数据中。 或者是文件的上传, 处理中使用, 一个视频几百兆上传一次要几分钟, 你不可能让客户等待过长的时间, 而是在开启异步线程后用户可以处理其他操作, 等待你异步上传视频处理完成后, 推送一个处理完成的提示即可。可以使用MQ来完成这些操作

也可以使用线程池开启异步方式:

 //定义一个线程池ExecutorService threadPool = Executors.newFixedThreadPool(10);//开启异步任务,定义对应的返回类型,提交给对应的线程池CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {return 10;},threadPool).thenApply((r)->{//接收上次结果在加工return 10 + 1;}).whenComplete((r,e)->{System.out.println("方法完成后执行的结果是:"+r);System.out.println("方法完成后执行的异常是:"+e);});

执行结果:

 方法完成后执行的结果是:11方法完成后执行的异常是:null

综上所述我们在项目开发时, 某些地方还是需要足够快的响应时间, 来优化用户体验。

JAVA中线程中的异步和同步相关推荐

  1. java什么时候需要同步_JAVA中线程在什么时候需要同步和互斥

    JAVA中线程在什么时候需要同步和互斥 关注:265  答案:6  mip版 解决时间 2021-01-27 08:10 提问者时光易老 2021-01-27 03:32 JAVA中线程在什么时候需要 ...

  2. Java子线程中的异常处理(通用)

    Java子线程中的异常处理(通用) 参考文章: (1)Java子线程中的异常处理(通用) (2)https://www.cnblogs.com/toplist/p/7594557.html 备忘一下.

  3. java 异常处理线程_转:Java子线程中的异常处理(通用)

    在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally ...代码块就可以了.那么,在并发情况下,比如在父线程中启动了子线程,如何正确捕获子线程中的异常,从而进行相 ...

  4. java exchanger_java线程中Exchanger使用

    有时我们须要对元素进行配对和交换线程的同步点,使用exchange方法 返回其伙伴的对象,这时我们就须要使用线程类中的Exchanger类了, 我通过一个实例 来简单说明一下他的用法及其作用: imp ...

  5. java之阻塞非阻塞异步和同步

    概念介绍 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 异步: 异步的概念和同步相对.当一个异步过程调用发出后,调用者不能立刻得到结果.实际处理这个调用的部件在完成 ...

  6. Java复习-线程之间的通信与同步

    为了实现这种功能,可以借助object对象提供的wait(),notify(),notifyall();这三个方法不属于thread类,而是属于object类,但是这三个方法必须由同步监视器来调用,对 ...

  7. 加了try的情况下线程中抛出未捕获的异常

    一.问题描述 项目中线程中明明加了try catch 捕获异常,但是一启动就报未捕获的异常导致整个程序崩溃. 下面是windows中的错误日志. Application: 岗亭收费.exe Frame ...

  8. verilog异步复位jk触发器_异步复位同步释放原理

    关键词:同步释放,recovery,removal 在数字IC设计中肯定会涉及到异步复位的问题,因为需要对电路进行复位操作.这种复位设计主要依靠前端设计以及工具来检查,从数字IC后端的角度上讲,只要在 ...

  9. 异步复位同步释放原理

    深度揭秘异步复位同步释放原理 文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点.点击进去后出现任何损失与社区无关. 明天就放端午小长假了,提前祝大家节日快乐.腾讯官网已经给小编公众号开通了赞赏功 ...

最新文章

  1. A query was run and no Result Maps were found
  2. 域控制器活动目录之备份与恢复
  3. 【Python之路Day17】Python Web框架之 Django
  4. ICDAR 2019国际竞赛召开在即,百度联合学界重奖破局者!
  5. 练习系列 - 5、求子数组的最大和
  6. 百度三轮面试回来,想和Java程序员分享一下。
  7. zz从一道笔试题谈算法优化(上)
  8. NumPy Cookbook 带注释源码 三、掌握 NumPy 常用函数
  9. 20200225:最小路径和(leetcode64)
  10. 计算机组成原理题集,计算机组成原理试题集含答案
  11. kettle 创建脚本文件
  12. Qt QLabel文本框的使用
  13. html5+css3初学练手小米商城
  14. Hyper-v功能介绍和操作演示
  15. 小器件,大作用-光纤环形器在光纤传输中的应用
  16. [Android 9][markw] 红米4高配版 刷入Lineage OS 16与OpenGApps
  17. 1024 程序员节,拿个勋章
  18. 9、Linux文本处理三剑客之sed命令
  19. linux yum 安装node,CentOS7 下 yum安装新版nodejs
  20. markdown设置字体颜色、大小、背景

热门文章

  1. 智安网络丨一文区分等级保护与分级保护(等保与分保区别)
  2. 《扬帆优配》医药行业重新回归创新驱动 政策演变倒逼企业加速转型
  3. 《Conditional BERT Contextual Augmentation》
  4. java compareTo 整数_Java中的compareTo()函数是怎么用的?
  5. python删除Windows文件夹
  6. IntelliJ IDEA创建自己的xml模板
  7. 简单通讯录c语言程序注释,Objective-C简易通讯录的实现
  8. python爬虫——模拟登陆
  9. apache web服务器
  10. [HeMIM]Cl,[AeMIM]Br,[CeEIM]Cl,([HO-PECH-MIM]Cl,[HOOC-PECH-MIM]Cl改性酚醛树脂