什么是多线程&多线程的优点
多线程是指程序中包含多个执行流,即一个程序中可以同时运行多个不同的线程来执行 不同的任务。
优点: 可以提高 cpu 的利用率 。 多线程中, 一个线程必须等待的时候, cpu 可以运行其 它的线程而不是等待, 这样大大提高了程序的效率。
如何创建多线程
Java 3 种常见创建多线程的方式
(1) 继承 Thread 类, 重 run()方法
(2) 实现 Runnable 接口, 重写 run()方法
(3) 通过创建线程池实现
如何创建线程池
Executors 提供了线程工厂方法用于创建线程池, 返回的线程池都实现了 ExecutorServer 接口。
newSingleThreadExecutor
newFixedThreadExecutor
newCachedThreadPool
newScheduledThreadPool
虽然 Java 自带的工厂方法很便捷, 但都有弊端,《阿里巴巴 Java 开发手册》中强制线程 池不允许使用以上方法创建, 而是通过 ThreadPoolExecutor 的方式, 这样处理可以更加明确 线程池运行规则, 规避资源耗尽的风险。
ThreadPoolExecutor 构造函数参数解析
(1) corePoolSize 创建线程池的线程数量
(2) maximumPoolSize 线程池的最大线程数
(3) keepAliveTime 当线程数量大于 corePoolSize , 空闲的线程当空闲时间超过 keepAliveTime 时就会回收;
(4) unit { keepAliveTime} 时间单位
(5) workQueue 保留任务的队列
列举线程安全的 Map 集合
SynchronizedMap 、 ConcurrentHashMap
StringBuffer 和 StringBuilder 的区别
(1) StringBuffer 中的方法大都采用 synchronized 关键字进行修饰, 是线程安全的, 效 率低。
(2) StringBuilder 是线程不安全的, 效率高。
ArrayList 和 LinkedList 的区别
(1) ArrayList 基于动态数据实现, LinkedList 基于链表实现, 两者都是线程不安全的
(2) ArrayList 基于数组, 查询快; linkedList 基于链表, 新增和删除更快
(3) LinkedList 不支持高效的随机访问
HashMap 和 HashTable 的区别
1) 继承的父类不同
HashMap 继承 AbstractMap 类
HashTable 继承 Dictionary 类 (已经废弃的类), 用比较少
2) 是否线程安全
HashMap 是线程不安全的效率高, HashTable 是线程安全的, 效率低。
3) key 和 value 是否允许 null 值
Hashtable 中, key 和 value 都不允许出现 null 值 。 HashMap 中, 都可出现 null。
HashMap 的底层原理
1) HashMap 的实现原理
HashMap 实际上是一个数组和链表的结合体, HashMap 基于 Hash 算法实现的;
(1) 当我们向 HashMap 中 Put 元素时, 利用 key 的 hashCode 重新计算出当前对象的 元素在数组中的下标
(2) 写入时, 如果出现 Hash 值相同的 key, 此时分类, 如果 key 相同, 则覆盖原始值; 如果 key 不同, value 则放入链表中
(3) 读取时, 直接找到 hash 值对应的下标, 在进一步判断 key 是否相同, 进而找到对 应值
2) HashMap 在 JDK1.7 和 JDK1.8 中有哪些区别
JDK1.7: 数组 + 链表
JDK1.8: 数组+红黑树
3) HashMap 的 Put 方法具体流程
4) HashMap 的扩容
HashMap 中的键值对大于阈值或者初始化时, 就调用 resize()进行扩容。 每次扩展的时候都是扩展 2 倍。
HashMap 里面放 100 条数据, 初始化应该是多少
扩容因子 0.75
100/0.75 ≈ 133.3
初始化 134
评论留言