说到线程池,肯定会说到线程池的执行过程,也就是任务进入线程池后,线程池是如何执行的?今天就来聊聊这个话题。线程池是如何执行的?线程池的拒绝策略有哪些?线程池执行过程要想真正了解线程池的执行过程,首先要从线程池的执行方法execute()说起。execute()实现源码如下:publicvoidexecute(Runnablecommand){if(command==null)thrownewNullPointerException();intc=ctl.get();//当前工作线程数小于核心线程数if(workerCountOf(c)(1),newThreadPoolExecutor.DiscardPolicy());//添加并执行4个任务threadPool.execute(runnable);threadPool.execute(可运行);线程池。执行(运行可用);threadPool.execute(可运行);//线程池执行完任务后,关闭线程池threadPool.shutdown();}上面程序的执行结果如下:从上面的执行结果可以看出增加了4个线程线程池任务,线程池在结束前只执行2个任务,另外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(runnable);苏eadPool.execute(可运行);threadPool.execute(可运行);threadPool.execute(可运行);//线程池执行完任务后,关闭线程池threadPool.shutdown();}以上程序的执行结果如下:从结果可以看出线程池中加入了4个任务,线程pool正常执行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个任务threadPool.execute(runnable);threadPool.execute(可运行);threadPool.execute(可运行);threadPool.execute(runnable);}以上程序的执行结果如下:总结一下线程池的执行过程,有3个重要的判断点(依次判断顺序):判断当前线程数和核心线程数,判断当前任务队列是否满,判断当前线程数是否达到最大线程数,如果以上三个判断结果都为真,则执行拒绝策略线程池。JDK提供了4种拒绝策略,我们也可以通过newRejectedExecutionHandler实现自定义拒绝策略,重写rejectedExecution方法。本文转载自微信公众号《Java面试题解析》,可通过以下二维码关注。转载本文请联系Java面试真题解析公众号。