说说线程的状态?
新建(New):线程被创建但尚未启动执行。
就绪(Runnable):线程等待CPU时间片以便执行,也就是处于就绪状态。
阻塞(Blocked):线程暂停执行,通常是因为等待某些条件满足,例如等待I/O操作完成、等待锁释放等。
无限期等待(Waiting):线程无限期地等待某个条件的发生,通常需要其他线程来唤醒它。
有限期等待(Timed Waiting):线程等待一段时间,超过指定时间后会自动唤醒。
终止(Terminated):线程执行完成或者异常终止,进入终止状态。
线程创建方式有哪些?
继承Thread抽象类
实现Runnable接口
实现Callable接口
通过ThreadPoolExecutor线程池
并发安全集合类都哪些?
ConcurrentHashMap 是线程安全的哈希表实现,它通过分段锁的机制来实现并发访问的高效性。 CopyOnWriteArrayList 是线程安全的 List 实现,它通过复制底层数组的方式保证线程安全,适用于读多写少的场景。
CopyOnWriteArraySet 是 CopyOnWriteArrayList 的 Set 版本
BlockingQueue 是一个用于在多线程间传递数据的队列接口,它包含多个实现类,如 ArrayBlockingQueue、LinkedBlockingQueue
如何创建线程池?说说7个参数和线程池工作原理?
使用Executors工厂
使用ThreadPoolExecutor构造函数
ThreadPoolExecutor的七个参数:
corePoolSize(核心池大小)不会被回收
maximumPoolSize(最大池大小)会被回收
keepAliveTime(线程空闲存活时间)
unit(时间单位)
workQueue(工作队列)
LinkedBlockingQueue大小无限制
ArrayBlockingQueue大小有限,必须指定容量
SynchronousQueue不存储任务,直接给线程池
threadFactory(线程工厂)
handler(拒绝策略)
AbortPolicy: 直接抛出异常
CallerRunsPolicy:返回给调用者线程执行该任务
DiscardPolicy:直接丢弃该任务
DiscardOldestPolicy:丢弃最旧的一个任务
工作原理:
提交新任务时,线程池进行判断是否有空闲线程,有就直接执行,没有就查看是否到达核心线程数,没有就创建新的线程执行,
如果达到核心线程数但任务队列有空间,进入任务队列,
如果任务队列也已经满了,查看是否到达最大线程数,没有到达最大线程数就创建新的线程,若到达最大线程数,执行拒绝策略
当队列中的任务执行完,线程空闲时间到达预设时间,销毁超出核心线程数的线程
JMM模型特性有哪些?如何保证这些特性?
可见性
使用 volatile关键字声明变量,确保修改对于所有线程立即可见
有序性
volatile 保证对该变量的读写操作是有序的,禁止重排序。
原子性
synchronized同步锁确保对共享变量的操作是原子的。
atomic提供的原子类AtomicInteger、AtomicLong等