说到线程池,肯定会说到线程池的执行过程,也就是任务进入线程池后,线程池是如何执行的?今天就来聊聊这个话题。线程池是如何工作的?线程池的拒绝策略有哪些?线程池执行过程要想真正了解线程池的执行过程,还得从线程池的执行方法execute()说起。execute()的源码如下:publicvoidexecute(Runnablecommand){if(command==null)thrownewNullPointerException();intc=ctl.get();//当前工作的线程数小于核心线程数if(workerCountOf(c)(1),newThreadPoolExecutor.DiscardPolicy());//添加并执行4个任务threadPool.execute(runnable);threadPool.execute(可运行);日readPool.execute(可运行);threadPool.execute(可运行);//线程池执行完任务后,关闭线程池threadPool.shutdown();}以上程序的执行结果如下:从上面的执行结果可以看出线程池增加了4个任务,但是线程池只执行了2个任务就结束了,另外两个任务执行了拒绝策略DiscardPolicy被忽略了,这就是拒绝策略的作用AbortPolicy拒绝策略为了和DiscardPolicy拒绝策略进行对比,我们来演示一下JDK默认的拒绝策略AbortPolicy中止策略,线程池会抛出异常终止本次任务的执行,示例代码如下:publicstaticvoidmain(String[]args){//任务的具体方法Runnablerunnable=newRunnable(){@Overridepublicvoidrun(){System.out.println("当前任务执行完毕,执行时间:"+newDate()+"执行线程:"+Thread.currentThread().getName());try{//等待1sTimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione){e.printStackTrace();}}};//创建线程,线程的任务队列长度为1ThreadPoolExecutorthreadPool=newThreadPoolExecutor(1,1,100,TimeUnit.SECONDS,newLinkedBlockingQueue<>(1),newThreadPoolExecutor.AbortPolicy());//显式指定拒绝策略,也可以忽略这个Set,它是默认的拒绝策略//添加并执行4个任务threadPool.execute(可运行);threadPool.execute(可运行);threadPool.execute(可运行);threadPool.execute(可运行);//线程池执行完任务后,关闭线程池threadPool.shutdown();}以上程序的执行结果如下:从结果可以看出,线程池中增加了4个任务,线程池中2个任务已经正常执行,另外2个任务执行了挂起策略,并抛出拒绝执行的异常RejectedExecutionException自定义拒绝策略当然,除了JDK提供的四种拒绝策略外,我们还可以通过newRejectedExecutionHandler,重写rejectedExecution方法实现自定义拒绝策略。实现代码如下:publicstaticvoidmain(String[]args){//任务的具体方法Runnablerunnable=newRunnable(){@Overridepublicvoidrun(){System.out.println("The当前任务被执行,执行时间:"+newDate()+"执行线程:"+Thread.currentThread().getName());try{//等待1sTimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione){e.printStackTrace();}}};//创建线程,线程任务队列长度为1ThreadPoolExecutorthreadPool=newThreadPoolExecutor(1,1,100,TimeUnit.SECONDS,newLinkedBlockingQueue<>(1),newRejectedExecutionHandler(){@OverridepublicvoidrejectedExecution(Runnabler,ThreadPoolExecutorexecutor){//执行自定义拒绝策略的相关操作System.out.println("我是自定义拒绝策略~");}});//添加并执行4个TaskthreadPool.execute(runnable);threadPool.execute(可运行);threadPool.execute(可运行);threadPool.execute(runnable);}上面程序的执行结果如下:总结线程池的执行过程有3个重要的判断点(判断顺序在下):判断当前数线程数和核心线程数,判断当前任务队列是否满,判断当前线程数是否达到最大线程数,如果以上三个判断得到的结果都为真,则执行拒绝线程池的策略。JDK提供了4种拒绝策略,我们也可以通过newRejectedExecutionHandler实现自定义拒绝策略,重写rejectedExecution方法。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview