线程池
JDK为我们提供了4种构造线程池的方式,分别是
- newFixedThreadPool
- 固定数量的线程
- newSingleThreadExecutor
- 只有一个线程的线程池
- newCachedThreadPool
- 线程数量不固定,不停的创建线程,用完了以后又回收
- newScheduledThreadPool
- 提交任务后,在指定的时间去执行
我们也可以构造自己的线程池,来实现一些我们想要的一些功能。
Map是集合里一个非常重要的数据结构,面试也是会经常问到源码的。
简单描述一下HashMap的原理,它的结构就是数组+链表+红黑树。
put的时候,对key进行hash,找到对应的数组位置放在里面,然后hash冲突了就组成链表往后追加。查询的时候也是一样,对key进行hash,然后用equals去比较链表上key的值。
JDK1.8优化了hashmap的数据结构,如果链表过长,达到8以后,就会转变成红黑树。
这个数组的初始化长度,是16,和ArrayList不一样。
1 | // 数组变量 |
准备写一些文章,把集合、并发、网络相关的JDK工具的使用和源码都在这里记录一下。首先从简单的集合源码开始。
基于数组的集合,默认的构造函数,给了一个空数组,Object[], {},默认的初始化大小为10。
1 | /** |
一般在构造ArrayList,建议指定一个大小,避免频繁扩容带来的开销。
每次往ArrayList中插入数据的时候,都会判断当前数组的元素是否塞满了,如果塞满的话,此时就会扩容这个数组,然后将老数组中的元素拷贝到新数组中去,确保说数组一定是可以承受足够多的元素的。
服务在启动后,会向eureka server发起注册,应该是在1秒以内的。
会通过SpringCloud额外封装的EurekaAutoServiceRegistration#start()
发起注册,这个类的实例被EurekaClientAutoConfiguration定义。
一个服务启动后,发现其他所有的服务需要多长时间?如果其他服务新增了机器,那么又需要多长时间才能发现。