2024年4月20日发(作者:)
摩尔线程面试题
1、提高效率创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,
这要比需要的时候创建一个线程对象要快的多。
2、方便管理可以编写线程池管理代码对池中的线程同一进行管理,比如说启动时有
该程序创建100个线程,每当有请求的时候,就分配一个线程去工作,如果刚好并发有
101个请求,那多出的这一个请求可以排队等候,避免因无休止的创建线程导致系统崩溃。
1、newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按
照指定顺序(FIFO,LIFO,优先级)执行。
2、newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3、newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无
可回收,则新建线程。
4、newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样
的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。说明:
Executors各个方法的弊端:
1)newFixedThreadPool和newSingleThreadExecutor:
主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。
2)newCachedThreadPool和newScheduledThreadPool:
主要问题是线程数最大数是_VALUE,可能会创建数量非常多的线程,
甚至OOM。
Positiveexample1:
Positiveexample2:
Positiveexample3:
个人在项目中用到的是第三种,业务需求,每天会有调度服务器会通过http协议请
求
1、ArrayBlockingQueue
是一个基于数组结构的有界阻塞队列,此队列按FIFO(先进先出)原则对元素进行
排序。
2、LinkedBlockingQueue
一个基于链表结构的阻塞队列,此队列按FIFO(先进先出)排序元素,吞吐量通常
要高于ArrayBlockingQueue。静态工厂方法edThreadPool()使用了
这个队列
3、SynchronousQueue
一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则
插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法
hedThreadPool使用了这个队列。
4、PriorityBlockingQueue
一个具有优先级的无限阻塞队列。
corePoolSize:核心池的大小,这个参数跟后面讲述的线程池的实现原理有非常大的
关系。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来
才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者
发布者:admin,转转请注明出处:http://www.yc00.com/news/1713584673a2278097.html
评论列表(0条)