1.协程,同步方式编写,为什么不会阻塞主线程
和线程一样都是解决了异步线程切换问题,协程最主要的是通过非阻塞的挂起和恢复实现了异步代码的同步编写方式,吧原本运行在不同线程的代码写在了同一个代码块中,看起来像同步代码。
首先协程也是运行在线程中的,它可以说是基于线程的封装库,
---当主线程调用到挂起函数的时候,协程就会把当前线程挂起,这就是非阻塞式挂起,主线程暂时停止执行这个协程代码块中的剩余代码--是暂停,不是阻塞---》主线程暂时从这个协程中被释放出去处理其他handler消息。比如用户操作,绘制view等。
挂起函数有谁执行---》这要看挂起函数有没有内部切换线程,如果没有切换,就还是主线程执行。一般就是suspend函数。
2.什么时候更适合用线程,什么时候更适合用协程?
线程:cpu密集型计算之类的仍无,活着一些特定的阻塞任务。
并行执行多个独立任务,比如下载多个文件。
协程:处理数据流时,协程提供了更简单和优雅的方式
总的来说,当你的应用需要处理大量的并发任务,并且需要高效地管理资源时,协程通常是更好的选择。而对于一些特定的阻塞任务或需要利用多核处理器的 CPU 密集型任务,线程可能更为合适
3 。WebSocket 是什么原理?为什么可以实现持久连接?
在短http协议中,每次请求都需要建立和关闭链接,这些建立连接和关闭都会消耗网络资源。websockt可以建立一次连接。
关闭连接:
当双方中的一方决定关闭连接时,它会发送一个关闭帧,通知另一方关闭连接。
另一方收到关闭帧后,也会回复一个关闭帧,然后双方都关闭连接。
在Java WebSocket中实现长连接需要定期发送"心跳"消息以保持连接活跃。这通常是通过在服务器和客户端之间建立一种协议来完成的,其中客户端定期发送特定的消息到服务器,服务器也会定期回复相应的消息。如果在规定的时间内没有收到客户端的心跳消息,服务器可以认为连接已经断开,并进行相应的清理工作。