其实异步是目的,多线程是实现这个目的方法。
- 异步:A发起一个操作后,可以继续自顾自的处理它自己的事儿,不用干等着这个耗时操作返回
- 随着拥有多线程CPU,多核的普及,多线程和异步操作等并发程序设计方法也受到更多
1、多线程和异步操作的异同
- 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。
- 甚至有些时候我们认为多线程和异步操作是等同的。但是多线程和异步操作还是有一些区别
2、异步操作的本质:
- 所有的程序最终都会由计算机硬件来执行。所以为了更好的理解异步操作的本质,网卡,声卡,显卡都是有DMA功能的DMA就是直接内存访问的意思(Driect Memory Access)
- 也就是说,拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源
- 只要CPU在发起数据传输时发送一个指令,硬件就开始自己和内存交换数据在传输完成后硬件会触发一个中断来通知操作完成这些无需消耗CPU时间的I/O操作正是异步操作的硬件基础。
- 所以即使在DOS这样的单进程(无线程概念)系统中也同样可以发起异步的DMA操作
3、线程的本质
- 线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能
- 线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度
4、异步操作的特点
- 因为异步操作 不需要额外的线程负担,并且使用回调的方式进行处理在设计良好的情况下,处理函数可以不必使用共享变量,即使无法完全不用,最起码也可以减少共享变量的数量。减少了死锁的可能。
- 当然异步操作也并非完美无瑕。编写异步操作的复杂程度较高,程序主要使用回调方式进行处理与普通人的思维方式有些初入,而且难以调试。
5、多线程的优缺点
- 线程中的护理程序依然是顺序执行,符合普通人的思维习惯。所以编程简单但是多线程的缺点也明显
- 线程的滥用会给系统带来上下文切换的额外负担并且线程间的共享变量可能造成死锁的出现。
- 当需要执行I/O操作的时候,使用异步操作比使用线程+同步I/O操作更合还是I/O操作不仅包括了直接的文件,网络的读写,还包括数据库操作,WebService,HttpRequest等跨进程的调用
- 线程的适用范围是需要长时间CPU运算的场合比如耗时较长图形处理和算法执行,但是往往由于线程编程的简单和符合习惯,所以很多朋友往往适用线程来执行耗时较长的IO操作,这样在之后又少数几个并发操作的时候还行,需要处理大量的并发操作就不合适了,因为要不停的上下文切换
6、异步调用
- 异步调用并不是要减少线程的开销,目的是让调用方法的主线程不需要同步等待这个函数
- 调用上,从而可以让主线程继续执行他下面的代码,同时系统会从ThreadPool线程池中取一个线程来执行,帮助我们将我们要写/读的数据发送到网卡,由于不需要我们等待,我们等于同时做了两件事情
7、线程池的实现方法
- 线程池的实现方法与线程不一样的,初始化时候,在线程池的线程为0,当进程需要一个线程的时候,创建一个线程由此线程执行用户的方法,这个线程执行完后并不立即销毁,而是挂起等待,如果有其他方法需要
- 执行,则唤醒进行处理 ,只有当它等待到40秒还没有任务执行的时候才唤醒自己,并销毁自己
- 当然如果线程池中的线程不够处理任务的时候,会再次创建一个新的线程来执行。