2.线程池面试.txt

UP 返回
1.为什么使用线程池
 线程池的复用机制:提前建好一些固定的线程数一直在运行状态,实现复用,减少就绪到运行状态的切换
 降低资源消耗,提高响应速度,便于管理监控,还可以添加额外功能(如延期执行,定期执行)

2.项目中哪些地方用到了线程池
	邮件发送(WeLink发送) 画质增强(热点和专题) 大批量的文件上传 异步爬取

3.线程池的创建方式
	jdk自带的4种:
		Executors.newFixedThreadPool(5)
		Executors.newCachedThreadPool()
		Executors.newSingleThreadExecutor()
		xecutors.newScheduledThreadPool(5)
	实际开发不推荐使用上述方法,因为底层都是基于ThreadPoolExecutor封装的,且默认的都是无界阻塞队列,可能会导致内存溢出
	同时因为无界队列的存在,等待队列永远不会满,也就会一直使用核心线程执行任务,最大线程数就会失效

4.线程池复用原理
	提前创建好固定线程一直运行	就是通过死循环实现
	提交的线程缓存到一个并发队列中
	正在运行的线程就到队列中获取任务执行

5.强引用:永远不会被回收
   软引用:堆空间不足时才会被回收。通常用在对内存敏感的应用中,比如高速缓存
   弱引用:只要触发回收,就会被回收(WeakReference)

6.Lock锁和synchronized锁的区别
	Lock锁底层基于AQS+Cas+LockSupport锁实现
		可以使用LockSupport.park();	LockSupport.unpark(thread1);阻塞/唤醒线程
		!!@@202501291.img_598_231_1@@!!
	AQS就是AbstractQueuedSynchronizer类的缩写,常用的锁类都是继承该类。
	维持了一个值,使用cas进行赋值,加锁时自增,解锁时自减,最终大于0表示加锁成功,等于0表示最终释放锁

	自己实现锁:
		!!@@202501301.img_681_936_1@@!!
	
DOWN 返回