获得徽章 5
- 线程池概念
线程池是对多个线程的统一管理器
通常线程的创建都是new Thread不使用时销毁 并没有进行管理
线程池内部有空闲线程的队列 当任务到时优先让给空闲线程处理
当线程执行完任务 继续入队复用
使用线程池可以实现线程的复用 节省线程创建的开支
当核心线程未满时 会分配核心线程 再为非核心线程
在实际工作中尽量用线程池管理开辟的线程
不同类型的线程池处理不同的任务
singleThreadPool处理单次任务
fixedThreadPool在已知项目消耗线程数前提上可以使用 最大利用
scheduleThreadPool 当需要处理周期任务
cacheThreadPool 可缓存线程池 可灵活回收空闲线程展开评论点赞 - 多线程并发编程
三要素
1.原子性 一系列操作要么全部执行要么失败(Synchronized,Lock,AtomicXXX)
2.有序性 程序按照代码的顺序先后执行 避免指令重排列(voliate,Synchronized,Lock)
3.可见性 当多线程访问同一个变量 其中一个线程修改了 其他线程也要读新的值(voliate,Synchronized,Lock)
注:
synchronized 由JVM控制 监视方法变量代码块的互斥访问
voliate只能保证基本类型的原子性
Lock规范了作为锁所具备的行为 实现类为读写锁 ReentrantLock等展开评论点赞 - 架构高可用移动网络连接
大多数的网络连接都会向DNS服务器解析域名 会消耗一个往返(RTT)的时间
但DNS解析是有隐患的 比如耗时 不稳定 解析失败 劫持等情况
1)解决耗时和稳定性
阿里云腾讯云等维护自身的HttpDns 当http请求时 根据请求的地理位置返回IP地址列表
同时会进行测试 按照速度进行排序 并且下发了缓存有效时间TTL 客户端可以在这个有效期内使用缓存在本地的IP地址列表
过期后再去请求新的 (保证了速度最优的地址选择)
规模小点的项目可以使用更加轻量的方案:内置IP列表
IP列表内嵌APP 首先对IP列表逐个测速 根据结果动态改变权重(优先级) 然后提供给网络连接
2)刷新机制
选择最优的IP地址是针对单个网络链路而言 但如果网络切换了 从WIFI到4G到3G或者A WIFI到B WIFI
整条网络链路都会变换,需要及时的刷新机制保障
1.TTL过期刷新
2.广播监听网络变化 变化后触发IP列表异步刷新测速 及时替换
3.服务器下发 用来减缓某台服务器的压力
缓存的具体形式KV (网络类型+网络标识):(IP地址) 可以同时使用磁盘和内存缓存
3)容错兜底
如果APP打开后HTTPDNS没有完成 或被拦截了怎么办
准备多个策略进行优先级
1.HTTPDNS
2.本地DNS
3.动态下发IP列表
4.硬编码IP列表
4)弱网优化
弱网情况下连接很难成功建立
串行连接 先连接IP 超时换下一个
并行连接 多个IP同时连接哪个先通用哪个
实际使用可以综合两种连接 可以分多组进行连接 连接失败 从这组下一个进行连接 当其中一个连接建立成功 则停止其他连接请求
5)自主诊断
获取用户手机网络链路 存储数据上报
在Android中可以开启后台线程 执行ping命令
或者通过编译C开源库iputils 进行traceroute模拟展开赞过21 - 如何对网络请求进行优化?
1.减少DNS解析的时间 直接使用IP连接
2.使用Gzip压缩请求或者响应体来减少数据量 也可以用protocol buffer协议替代json
3.使用网络缓存 请求同内容直接从缓存返回
4.通过广播监听网络设备 在不同的网络状态进行不同的请求策略:网络顺畅(可以请求大内容也可以同时发起多个请求),
弱网环境(可以请求中等内容 类型优先级优先为文本再次为富文本),离线环境直接从缓存找展开评论点赞 - 说下切换横竖屏时Activity的生命周期?
默认情况下切换横竖屏是会重启当前Activity的(但会保存Activity的状态)
onResume->onPause->onSaveInstanceState(保存Activity当前的状态)->onStop->onDestroy
onCreate->onRestoreInstanceState(恢复关闭前的状态)->onResume
如果在Manifest中配置了configChanges
就不会调用Acitivity的生命周期 只会调用onConfigurationChanged方法展开评论点赞 - JVM、Dalvik、ART三者的原理和区别?
JVM是指某个特定的JAVA虚拟机实现 是一个通用的范畴
Dalvik是早期用来做Android专用的虚拟机用来运行DEX格式的程序 允许运行多个虚拟机实例 每一个应用作为单独的linux进程运行 运行方式是会将dex代码转为微处理指令(边解释边执行)
也使用到了JIT(JustInTime)将代码编译成nativecode提高执行效率(运行时编译)
ART(Android Runtime)是使用了AOT(Ahead of Time)预编译在应用安装时就把字节码编译为机器码这样运行时就可以直接运行机器码执行效率更高但安装时间会慢
目前的运行环境应该是解释执行+JIT+空闲时AOT三种合用来保证运行和安装效率展开评论点赞 - JVM、Dalvik、ART三者的原理和区别?
JVM是指某个特定的JAVA虚拟机实现 是一个通用的范畴
Dalvik是早期用来做Android专用的虚拟机用来运行DEX格式的程序 允许运行多个虚拟机实例 每一个应用作为单独的linux进程运行 运行方式是JIT(Just In Time)边解释边运行
ART是使用了AOT(Ahead of Time)预编译在应用安装时就把字节码编译为机器码这样运行时就可以直接运行机器码执行效率更高但安装时间会慢展开评论点赞 - Java 中深拷贝与浅拷贝的区别?
浅拷贝:如果拷贝的对象成员里有引用类型的话这个引用是不会改变的 还是当前地址的拷贝
深拷贝:创建的对象的值包括引用也会复制一份
场景:当我们分别用浅拷贝或者深拷贝复制多个对象时
修改其中一个对象的引用属性 浅拷贝会全部变化 深拷贝只会改变当前对象展开评论点赞 - 谈一谈线程sleep()和wait()的区别?
Thread.sleep使用时会确定睡眠的时间主要是为了暂停当前线程,把cpu片段让出给其他线程,减缓当前线程的执行,并没有释放线程的锁
Object.wait会使线程释放锁 并进入Wait状态进入等待队列 等待notify or notifyall
使线程进入锁池状态竞争锁竞争成功后进入就绪状态展开评论点赞