深圳企业网站开发公司郓城建设局网站
2026/5/21 12:12:10 网站建设 项目流程
深圳企业网站开发公司,郓城建设局网站,做网站需要的图片,安装网站系统线程池的八股1、说一下线程池的核心参数#xff1f;ThreadPoolExecutor线程池的核心参数有7个#xff0c;1.核心线程数目(corePoolSize)、2.最大线程数目(maximumPoolSize)#xff0c;最大线程数目核心线程临时线程、3.生存时间(keepAliveTime)#xff0c;是临时线程的生存…线程池的八股1、说一下线程池的核心参数ThreadPoolExecutor线程池的核心参数有7个1.核心线程数目(corePoolSize)、2.最大线程数目(maximumPoolSize)最大线程数目核心线程临时线程、3.生存时间(keepAliveTime)是临时线程的生存时间生存时间内没有新任务临时线程会释放、4.时间单位(unit)、5.阻塞队列(workQueue)当核心线程满了之后新来的任务会进入队列排队队列满后会创建临时线程执行任务、6.线程工厂(threadFactory)定制线程对象的创建例如设置线程名字是否是守护线程等、7.拒绝策略(handler)当所有线程都在忙workQueue也放满时就会触发拒绝策略。2、线程池的执行原理首先提交任务会判断核心线程是否已满如果没满就正常工作如果已满的话就会判断这个阻塞队列是否已满如果阻塞队列没满就放入阻塞队列等待如果阻塞队列也满了就判断线程数是否小于最大线程数如果小于就创建临时线程这时临时线程默认是来执行新来的任务而不是执行从阻塞队列中取出的任务来执行如果不小于那就走拒绝策略。3、拒绝策略有哪些拒绝策略有4种1.AbortPolicy直接抛异常默认策略。2.CallerRunsPolicy使用调用者所在线程来执行任务如主线程main。3.DiscardOldestPolicy丢弃阻塞队列最靠前的任务来执行当前任务。4.DiscardPolicy直接丢弃任务。4、线程池中有哪些常见的阻塞队列有4种常见的阻塞队列1.ArrayBlockingQueue基于数组的有界阻塞队列FIFO。2.LinkedBlockingQueue基于链表的有界阻塞队列FIFO。3.DelayedWorkQueue优先级阻塞队列保证每次出任务的是执行时间最靠前的任务。4.SynchronousQueue不存储元素的阻塞队列每次插入操作都要等待一个移除操作。5、ArrayBlockingQueue和LinkedBlockingQueue有什么区别LinkedBlockingQueue默认是无界的支持有界ArrayBlockingQueue强制有界。LinkedBlockingQueue底层是链表ArrayBlockingQueue底层是数组。LinkedBlockingQueue是懒惰的创建节点时添加数据入队会生成新NodeArrayBlockingQueue是提前初始化Node数组Node需要是提前创建好的。LinkedBlockingQueue是两把锁链表的头和尾加锁ArrayBlockingQueue是全部一把锁一般平时常用的就是LinkedBlockingQueue。6、如何确定核心线程数分IO密集型任务和CPU密集型任务注N为CPU核数。如果并发不高、执行时间长的话设置为IO密集型任务核心线程数就是2N1设置为CPU密集型任务核心线程数就是N1。如果高并发、任务执行时间短的话核心线程数就是N1减少线程上下文切换。7、线程池的种类有哪些常见的有4种1.创建使用固定线程数的线程池就是核心线程数和最大线程数一样没有临时线程阻塞队列是LinkedBlockingQueue。2.单线程化的线程池核心线程数和最大线程数都是1阻塞队列是LinkedBlockingQueue。3.可缓存线程池核心线程数为0只有临时线程数阻塞队列是SynchronousQueue不存储元素的阻塞队列每次插入操作都要等待一个移除操作。3.提供了“延迟”和“周期执行”功能的ThreadPoolExecutor可以执行延迟任务的线程池支持定时及周期性完成任务。8、为什么不建议使用Executors创建线程池可能会堆积大量的请求创建大量的对象导致OOM内存溢出。9、谈谈你对ThreadLocal的理解为每个线程都分配一个独立的线程副本让多个线程只操作自己内部的值解决了并发访问冲突问题同时实现了线程内的资源共享。10、你知道ThreadLocal内存泄露问题吗线程内都维护了ThreadLocalMap成员变量用来存储资源对象调用set()方法以ThreadLocal作为key资源对象作为value放入ThreadLocalMap集合中然后调用get()方法到线程中查找自己key关联的资源。然后呢ThreadLocal有用到弱引用和强引用弱引用的内存会被回收而强引用不会被回收积累满了就可能发生内存泄露问题可以使用remove()移除当前线程资源来解决内存泄露问题。线程池的实现配置类Configuration public class ThreadPoolExecutorConfig { Bean public ThreadPoolExecutor threadPoolExecutor() { // 创建线程工厂 ThreadFactory threadFactory new ThreadFactory() { // 初始化线程数为1 private int count 1; Override public Thread newThread(NotNull Runnable r) { Thread thread new Thread(r); thread.setName(线程 count); count; return thread; } }; return new ThreadPoolExecutor(2, 3, 1000, TimeUnit.SECONDS, new ArrayBlockingQueue(4), threadFactory); } }演示线程池工作流程核心线程数2最大线程池3阻塞队列可存放任务4/** * 线程池队列测试接口 */ RestController RequestMapping(/queue) Slf4j public class QueueController { Resource private ThreadPoolExecutor threadPoolExecutor; // 核心线程数2最大线程池3阻塞队列可存放任务4 GetMapping(/add) public void add(String taskName){ // 创建任务 CompletableFuture.runAsync(()-{ log.info(当前线程 Thread.currentThread().getName() 正在执行任务 taskName); try { Thread.sleep(1000000); } catch (InterruptedException e) { throw new RuntimeException(e); } },threadPoolExecutor); } GetMapping(/get) public String get(){ MapString, Object map new HashMap(); long taskCount threadPoolExecutor.getTaskCount(); map.put(任务总数, taskCount); long completedTaskCount threadPoolExecutor.getCompletedTaskCount(); map.put(已完成任务数, completedTaskCount); int activeCount threadPoolExecutor.getActiveCount(); map.put(正在执行任务的线程数, activeCount); int size threadPoolExecutor.getQueue().size(); map.put(队列长度, size); return JSONUtil.toJsonStr(map); } }首先获取到当前状态情况以此类推发送任务2后执行情况如下两个核心线程占满按预期接着发送任务应该放到队列中队列长度1因为我们阻塞队列可以存放4个任务以此类推发满4个队列长度后再看看效果发送到任务7也就是阻塞队列占满4个后再发送一个任务任务总数为7队列长度依旧为4可以发现临时线程默认是来执行新来的任务而不是执行从阻塞队列中取出的任务来执行。接着再发送一个任务由于当前线程数最大线程数并且队列也满预期应该是走默认拒绝策略符合预期。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询