Java网络编程:同异步、是否阻塞与网络通信线程池
Java网络编程:同异步、是否阻塞与网络通信线程池
一、同步与异步、阻塞与非阻塞
1.1 同步通信机制
男孩向心仪的女孩表白,女孩子可能会陷入沉思,她要好好考虑是否接收表白,男孩子只需要默默地等待,这就类似于同步的通信机制,发出表白的男孩子就是发出请求的一方,在同步通信机制下,接收到请求的一方它需要花费时间去处理请求,处理完毕做出结束,整个通信才会返回
1.2 异步通信机制
女孩可能需要几天时间去考虑,过几天才发消息回复,这时候调用便结束,这时候女孩子可以回去思考了,当调用返回后请求方还是不知道调用结束,需要等待接收方过后的返回,这时候便是异步通信机制
1.3 阻塞式调用
男孩表白后,不断女孩子是沉思还是过几天回复,他都一直在一心意思等回复,什么都干不了,这种请求方在等待调用结束收到之前什么任务都不再处理,只在等待结果,这便是阻塞式调用
1.4 非阻塞式调用
男孩表白后,不理会女孩的结束,依旧去打游戏、学习、运动,这种请求方不需要等待调用结束返回,依旧可以去处理其他任务,这便是非阻塞式调用
1.5 两两组合
- 同步阻塞:男孩向女孩表白,女孩陷入思考,去处理,男孩一心一意等待结果
- 同步非阻塞:男孩向女孩表白,女孩陷入思考,去处理,男孩去学习运动,处理其他任务
- 异步阻塞:男孩向女孩表白,女孩让男孩回去等待,过后再返回结果,男孩一心一意等待结束
- 异步非阻塞:男孩向女孩表白,女孩让男孩回去等待,过后再返回结果,男孩去学习运动,处理其他任务
二、同步线程池
2.1 处理多个请求
服务器在很短时间内从不客户端收到很多请求,可以采用多个线程并发处理,例如银行可以多开几个窗口处理业务,但是多线程处理中处理浪费,如果我们每收到一个请求就为它创建一个线程,处理完毕后就回收,这里不断地创建新的线程,回收旧线程,这些操作占用比较多的系统资源,系统的总体系统资源也限制了创建线程的数目,这时候便需要采用复用线程,保持一定数量的一组线程,重复使用它们,处理完一个任务后便继续处理下一个任务,不进行回收
2.2 Java提供的线程池
ExecutorService接口,通过实现改接口来进行线程池的管理,对于一个线程池来说,当接收到任务后就派空闲的线程去处理任务,Java中常见的两种任务为Runnable与Callable,任务提交到线程池处理完毕之后,我们就在线程池中收到一个Future对象,
- Runnable接口一般指没有特定返回值的任务,例如我们提交这个任务返回值为void的时候,我们就可以使用Runnable
- Callable接口类似于运算,需要返回值,例如我们需要处理完任务后返回一个特定值,我们就可以使用Callable
- Future对象代表线程处理完任务后任务的状态,一般提供接口让我们去互动,例如isDone()判断任务是否完成,如果完成了可以利用get()去获取任务结果
2.3 Java提供的创建线程池的方法
Executors类,提供各种静态方法与函数用来直接帮我们创建常用的线程池
- newSingleThreadExecutor:这个线程池里面永远只有一个线程,复用唯一的线程
- newFixedThreadPool:生成线程池,可以设置线程数量,这个数量设定后便不再改变
- newCachedThreadPool:提交新任务时,恰好有空闲的线程就会来处理,恰好没空闲时的线程时,这时候就会创建一个线程,放入线程池中
- newScheduledThreadPool:提交任务时可以说明任务不需要马上处理,可设定某个时间,某个频率