线程池⾯试题中国高中排名
1、线程池的好处?网络营销培训机构
降低资源消耗,重复利⽤已创建的线程降低线程创建和销毁造成的消耗。
提⾼响应速度,当任务到达时,任务可以不需要等到线程创建就能⽴即执⾏。
提⾼线程的可管理性。线程是稀缺资源,如果频繁创建,会消耗系统资源,降低系统稳定性,使⽤线程池统⼀分配、调优和监控。
2、线程池的核⼼参数?
- corePoolSize(核⼼线程数)
核⼼线程会⼀直存在,即使没有任务执⾏;当线程数⼩于核⼼线程数,即使有空闲线程,也会⼀直创建线程直 到达到核⼼线程数;设置allowCodeThreadTimeout = true(默认为fal),核⼼线程会超时关闭。
- workQueue (⼯作队列)
当核⼼线程都在运⾏,此时再有任务进来,会进⼊任务队列,排队等待线程执⾏。
1、ArrayBlockingQueue:j基于数组的有界阻塞队列,按FIFO排序新任务进来后,会放到该队列的队尾,有界数组可以防⽌资源耗尽问题。当线程池中线程数量达到corePoolSize后,再有新任务进来,则会将任务放⼊该队列的队尾,等待被调度。如果队列已经是满的,则创建⼀个新线程,如果线程数量已经达到maxPoolSize,则会执⾏拒绝策略。
2、LinkedBlockingQueue:基于链表的⽆界阻塞队列(最⼤容量为Integer.MAX),按照FIFO排序。由于该队列的近似⽆界性,当线程池中线程数量达到corePoolSize后,再有新任务进来,会⼀直存⼊该队列,⽽不会去创建新线程知道maxPoolSize,因此使⽤该⼯作队列时,参数maxPoolSize是不起作⽤的。
3、SynchronousQueue:⼀个不缓存任务的阻塞队列,⽣产者放⼊⼀个任务必须等到消费者取出这个任务。也就是说新任务进来时,不会缓存,⽽是直接被调度执⾏该任务,如果没有可⽤线程,则创建新线程,如果线程数量达到maxPoolSize,则执⾏拒绝策略。
4、PriorityBlockingQueue:具有优先级的⽆界阻塞队列,优先级通过参数Comparator实现。
- maxPoolSize(最⼤线程数)
线程池允许存在的最⼤线程数量;当阻塞队列已满,且线程数量⼤于等于核⼼线程数时,会创建新的
线程执 ⾏任务;线程池允许存在的最⼤线程数量。当任务队列已满,且线程数据⼤于等于核⼼线程数时,会创建新的线程执⾏任务。
- keepAliveTime(线程空闲时间)
当线程空闲时间达到keepAliveTime时,线程会关闭,直到线程数等于核⼼线程数;如果设置了allowcOrethreadTimeOut = true,则线程会退出⾄等于零。
turkey怎么读
- unit (空闲线程存活时间单位)
keepAliveTime的计量单位
- threadFactory(线程⼯⼚)
创建⼀个新线程时使⽤的⼯⼚,可以⽤来设定线程名,是否为daemon线程(守护线程)等。
- handler (拒绝策略)
当线程数达到最⼤线程数,且阻塞队列已满时,会决绝任务;
1、CallerRunsPolicy:该策略下,如果线程池没有shutdown,就会直接执⾏被拒绝任务的run⽅法,
否则直接抛弃该任务。
2、AbortPolicy:该策略下,直接丢弃任务,并抛出RejectedExecutionException异常。
3、DiscardPolicy:该策略下,直接丢弃任务,什么都不做。
4、DiscardOldestPolicy:该策略下,抛弃进⼊队列最早的那个任务,然后尝试把这次拒绝的任务放⼊队列。
3、线程池的种类?
①newCachedThreadPool(可缓存线程池)
优点英语
创建⼀个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若⽆可回收,则新建线程。线程池为⽆限⼤,当执⾏第⼆个任务时第⼀个任务已经完成,会复⽤执⾏第⼀个任务的线程,⽽不⽤每次新建线程。
底层:返回ThreadPoolExecutor实例,corePoolSize为0;maximumPoolSize为Integer.MAX_VALUE;keepAliveTime为60L;unit 为TimeUnit.SECONDS;workQueue为SynchronousQueue(同步队列)
bl是什么意思的缩写通俗:当有新任务到来,则插⼊到SynchronousQueue中,由于SynchronousQueue是同步队列,因此会在池中寻找可⽤线程来执⾏,若有可以线程则执⾏,若没有可⽤线程则创建⼀个线程来执⾏该任务;若池中线程空闲时间超过指定⼤⼩,则该线程会被销毁。
适⽤:执⾏很多短期异步的⼩程序或者负载较轻的服务器
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory){
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>(), threadFactory);}
②newFixedThreadPool(定长线程池)
创建⼀个定长线程池,可控制线程最⼤并发数,超出的线程会在队列中等待。定长线程池的⼤⼩最好根据系统资源进⾏设置,如Runtime().availableProcessors()。
底层:返回ThreadPoolExecutor实例,接收参数为所设定线程数量nThread,corePoolSize为nThread,maximumPoolSize为nThread;keepAliveTime为0L(不限时);unit为:TimeUnit.MILLISECONDS;WorkQueue为:new LinkedBlockingQueue() ⽆解阻塞队列
通俗:创建可容纳固定数量线程的池⼦,每个线程的存活时间是⽆限的,当池⼦满了就不在添加线程;如果池中的线程均在繁忙状态,对于新任务会进⼊阻塞队列中(⽆界的阻塞队列)
适⽤:执⾏长期的任务,性能好很多
public static ExecutorService newFixedThreadPool(int nThreads){
return new ThreadPoolExecutor(nThreads, nThreads,
strap
0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}
③newSingleThreadExecutor(单线程化线程池)
brands
uccal
创建⼀个单线程化的线程池,它只会⽤唯⼀的⼯作线程来执⾏任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执⾏。
底层:FinalizableDelegatedExecutorService包装的ThreadPoolExecutor实例,corePoolSize为1;maximumPoolSize为1;keepAliveTime为0L;unit为:TimeUnit.MILLISECONDS;workQueue为:new LinkedBlockingQueue() ⽆解阻塞队列
通俗:创建只有⼀个线程的线程池,且线程的存活时间是⽆限的;当该线程正繁忙时,对于新任务会进⼊阻塞队列中(⽆界的阻塞队列)
适⽤:⼀个任务⼀个任务执⾏的场景
public static ExecutorService newSingleThreadExecutor(){
torani
return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1,1,
0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}
④newScheduledThreadPool (周期性线程池)
创建⼀个定长线程池,⽀持定时及周期性任务执⾏。
affection什么意思
底层:创建ScheduledThreadPoolExecutor实例,corePoolSize为传递来的参数,maximumPoolSize为Integer.MAX_VALUE;keepAliveTime为0;unit为:TimeUnit.NANOSECONDS;workQueue为:new DelayedWorkQueue() ⼀个按超时时间升序排序的队列
通俗:创建⼀个固定⼤⼩的线程池,线程池内线程存活时间⽆限制,线程池可以⽀持定时及周期性任务执⾏,如果所有线程均处于繁忙状态,对于新任务会进⼊DelayedWorkQueue队列中,这是⼀种按照超时时间排序的队列结构
适⽤:周期性执⾏任务的场景
public static ScheduledExecutorService newScheduledThreadPool(
int corePoolSize, ThreadFactory threadFactory){
return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);}
返回的是接⼝
前3个都是new的 ThreadPoolExecutor 这个核⼼类,返回的都是ExecutorService 接⼝.
最后⼀个不⼀样