Java线程池应用的四种方式+线程池底层实现原理
2026/5/23 12:55:25 网站建设 项目流程

线程池概述

可以有效避免同时创建或销毁多个线程对象造成的抖动问题。在JVM内存空间中,开辟指定空间,先创建指定个数的线程对象,供调用者调用;当已有对象不能满足操作时,则会按照事先设置的最大个数创建线程对象,供调用者调用;当使用完线程池后,一定销毁,降低内存损耗

Java中创建线程池的四种方式

通过newFixedThreadPool实现

方法:public static ExecutorService newFixedThreadPool(int nThread);
作用:会按照nThread的个数创建线程对象个数,即最大线程对象个数
代码实现:

publicclassCreateThreadPoolTest{publicstaticvoidmain(String[]args){ExecutorServicepool=Executors.newFixedThreadPool(5);for(inti=0;i<10;i++){intfinalI=1;/* 方法:public void execute(Runnable r) 作用:通过线程池对象调用指定线程接口实现类,完成线程操作 */pool.execute(newRunnable(){@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName()+"::"+finalI);}});}/* 方法:public void shutdown(); 作用:销毁线程池(必做项) */pool.shutdown();}}

通过newCachedThreadPool实现

方法:public static ExecutorService newCachedThreadPool();
作用:可伸缩线程池,最大支持同时存储21亿个线程对象,会按照循环操作次数,创建线程对象个数
代码实现:

importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassCreateThreadPoolTest1{publicstaticvoidmain(String[]args){ExecutorServicepool=Executors.newCachedThreadPool();for(inti=0;i<15;i++){intfinalI=1;pool.execute(newRunnable(){@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName()+"::"+finalI);}});}pool.shutdown();}}

通过newSingleThreadExecutor实现

方法:public static ExecutorService newSingleThreadExecutor();
作用:可排序线程池 用于医院银行等叫号系统 只会创建一个线程对象进行处理

importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassCreateThreadPoolTest2{publicstaticvoidmain(String[]args){ExecutorServicepool=Executors.newSingleThreadExecutor();for(inti=0;i<20;i++){intfinalI=1;pool.execute(newRunnable(){@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName()+"::"+finalI);}});}pool.shutdown();}}

通过newScheduledThreadPool实现

方法:public static ExecutorService newScheduledThreadPool(int n);
作用:n表示核心线程数

importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassCreateThreadPoolTest3{publicstaticvoidmain(String[]args){ExecutorServicepool=Executors.newScheduledThreadPool(5);for(inti=0;i<24;i++){intfinalI=1;pool.execute(newRunnable(){@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName()+"::"+finalI);}});}pool.shutdown();}}

线程底层实现原理

底层核心类:ThreadPoolExecutor

线程池七大核心参数

① corePoolSize:核心线程对象个数,即在线程池中初始创建的线程对象个数
② maximumPoolSize:最大线程对象个数,即当且仅当核心线程数不足以支持当前操作时,会按照最大线程对象个数创建非核心线程对象,完成操作
③keepAliveTime:存活时长,即设置非核心线程对象存活的时间
④unit:时间单位,即设置非核心线程对象存活的时间单位
⑤workQueue:工作队列,又称消息队列,主要用于存储等待被处理的对象
⑥threadFactory:线程工厂,主要用于按照最大线程对象个数创建非核心线程对象(线程工厂无需调用,会自动调用父类默认的)
⑦handler:拒绝处理器,主要用于使用Java中定义好的拒绝策略,拒绝消息队列中等待操作的对象,防止线程池中线程对象的过度调用

拓展:自定义线程池

可以通过上面的七个参数来自定义线程池去实现,如图中代码,上传了六个参数,其中线程工厂无需调用,会自动调用父类默认的

publicclassCreateThreadPoolTest4{publicstaticvoidmain(String[]args){//自定义线程池ThreadPoolExecutorpool=newThreadPoolExecutor(4,8,30,TimeUnit.MINUTES,newLinkedBlockingDeque<>(),newThreadPoolExecutor.AbortPolicy());for(inti=0;i<30;i++){intfinalI=1;pool.execute(newRunnable(){@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName()+"::"+finalI);}});}pool.shutdown();}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询