Java线程及线程池的相关的问题

发布时间:2026/6/5 8:31:43

Java线程及线程池的相关的问题 1、线程池有哪些状态线程池在Java中有五种状态RUNNING运行状态线程创建后默认进入此状态能够接受新任务并处理任务队列中的任务。如果不调用关闭方法线程池会一直保持此状态。SHUTDOWN关闭状态 调用shutdown()方法后进入此状态。现成池不再接受新任务但会继续处理任务队列中的任务直到到全部完成。STOP停止状态调用shutdownNow()方法后进入此状态。线程池不再接受新任务同时会中断正在执行的任务并放弃任务队列中的任务。TIDYING整理状态当所有任务(包括任务队列中的任务)都执行完毕且活动线程数降为0时现成池进入此状态。在此状态下会调用terminated()方法。TERMINATED销毁状态线程池在执行完terminated()方法后进入此状态,表示线程池完全关闭。2、线程有哪些状态线程在Java中有六种状态NEW初始状态 当一个线程对象被创建但尚未调用start()方法时它处于初始状态。RUNNABLE(运行状态)线程调用start()方法后进入就绪状态等待CPU调度当获得CPU时间片后进入运行中状态。运行状态还包括就绪(ready)和运行中(running)两种状态。BLOCKED阻塞状态 当现成视图进入一个被其他线程占用的同步代码块或方法时它进入阻塞状态等待锁的释放。WAITING等待状态 线程进入等待黄铜需要 等待其他线程显式唤醒。调用Object.wait、Thread.join()或者LockSupport.park()方法会使线程进入等待状态。TIMED_WAITING超时等待状态调用Thread.sleep(1000)Object.wait(1000)等方法会使线程进入超时等待状态。TERMINATED终止状态当任务执行完毕后就进入终止状态3、ThradLocalMap中的key为何要设计成弱引用Sun 公司现 Oracle在 JDK 源码中将 ThreadLocalMap 的 Key即 ThreadLocal 实例设计为弱引用主要是出于防御性设计的考虑旨在解决在特定场景下尤其是线程池极易发生的 Key 内存泄漏问题。具体原因可以从以下两个维度的对比来理解1. 假设 Key 使用强引用会导致 Key 泄漏如果 ThreadLocalMap 内部的 Entry 对 ThreadLocal 实例持有强引用当我们在业务代码中不再需要该 ThreadLocal 变量并将其置为 null 时由于当前线程如线程池中的核心线程依然存活ThreadLocalMap 依然持有该 Entry。此时Entry 强引用着 ThreadLocal 实例导致垃圾回收器GC无法回收它。只要线程不结束这个 ThreadLocal 对象就会一直驻留在堆内存中造成严重的内存泄漏。2. 采用弱引用JDK 设计者的“妥协”与“智慧”为了打破上述强引用链JDK 引入了弱引用WeakReference机制弱引用的特性只具有弱引用的对象在下一次 GC 发生时无论当前内存空间是否充足都会被直接回收。设计效果当外部业务代码不再持有 ThreadLocal 的强引用时ThreadLocalMap 中的 Key 会在 GC 时被自动回收变成 null。这从根本上保证了 ThreadLocal 对象本身能够被及时回收避免了 Key 层的内存泄漏。4、线程池如何预热核心线程可以使用ThreadPoolExecutor的prestartCoreThread或prestartAllCoreThreads方法预热核心线程。这样线程池默认是惰性创建线程的在需要及时响应的场景下提前预热可加快任务的处理从而缩短响应时间。5、如果需要将100个元素一次性高效写入HashMap中该如何做HashMap默认的初始化容量是16,扩容因子是0.75扩容数是2的幂次要使HashMap初始化后可以容纳100个元素不进行扩容需在创建HashMap中将初始化容量设计为100/0.751或者直接写256因为HashMap底层会将129-255之间的数字改写为2566、MVCC是什么在哪里用到MVCC(Multi-Version Concurrency Control)是多版本并发控制的英文简写是一种用于提高数据库并发性能的机制通过维护数据的多个版本来实现事物的隔离性允许读写操作同时进行从而提高数据库的并发性能和响应能力。MVCC的基本原理MVCC通过为每行数据维护多个版本来工作每个版本都有自己的创建时间和事务ID。当一个事务需要读取数据时它会读取对应版本的数据而不是最新的数据。MVCC避免了使用传统的锁机制来管理数据的并发访问减少了锁竞争从而提升了系统的吞吐量和响应时间。MVCC的实现基于undolog、版本链和readview。隐式字段在MySQL存储的数据中除了显式定义的字段MySQL会隐含地定义几个字段trx_id事务ID每进行一次事务操作就会自增1。roll_pointer回滚指针用于找到上一个版本的数据结合undolog进行回滚。ReadViewReadView是事务进行快照读操作时生成的读视图用于判断版本链中的哪个版本对当前事务是可见的。在RC隔离级别下每个快照读都会生成并获取最新的ReadView在RR隔离级别下只有在同一个事务的第一个快照读才会创建ReadView之后的每次快照读都使用同一个ReadView。版本链对于每次更新操作旧值会被保存到一条undolog中形成版本链。版本链的头节点代表当前记录的最新值每个版本还包含生成该版本的事务ID。7、有哪些容器是并发安全的Vector java 1.0中加入的线程安全的动态数组性能低Hashtable java早期的map性能低ConcurrentHashMapHashMap的线程安全版CopyOnWriteArrayListArrayList的线程安全版ConcurrentLinkedQueueLinkedList的线程安全版BlockingQueue阻塞队列ConcurrentSkipListMapTreeMao的线程安全版

相关新闻