2026/4/18 6:48:13
网站建设
项目流程
阿里云虚拟主机怎么做网站,如何制作ppt课件,浙江立鹏建设有限公司网站,移动网站备案创建方法#xff1a;Java原生创建线程池与Spring创建线程池Java原生创建线程池#xff1a;一、手动创建ThreadPollExecutor// Java原生线程池核心构造方法
ThreadPoolExecutor threadPool new ThreadPoolExecutor(int corePoolSize, // 核心参数1#xff1a;核心线程…创建方法Java原生创建线程池与Spring创建线程池Java原生创建线程池一、手动创建ThreadPollExecutor// Java原生线程池核心构造方法 ThreadPoolExecutor threadPool new ThreadPoolExecutor( int corePoolSize, // 核心参数1核心线程数常驻线程数 int maximumPoolSize, // 核心参数2最大线程数线程池能创建的最大线程数 long keepAliveTime, // 核心参数3空闲线程存活时间 TimeUnit unit, // 核心参数4存活时间的单位秒/毫秒等 BlockingQueueRunnable workQueue, // 核心参数5任务阻塞队列核心线程满了放这里 ThreadFactory threadFactory, // 核心参数6线程工厂自定义线程名称、优先级等 RejectedExecutionHandler handler // 核心参数7拒绝策略队列满线程满时的处理方式 );二、Spring创建线程池核心类是ThreadPoolTaskExecutor。纯注解方式ConfigurationBean,SpringBoot首选代码示例步骤一编写线程类的核心配置类Configuration public class SpringThreadPoolConfig { Bean(customThreadPool) public Executor customThreadPool() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(2); executor.setMaxPoolSize(5); executor.setQueueCapacity(10); executor.setKeepAliveSeconds(30); executor.setThreadNamePrefix(SPRING-THREAD-POOL-); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 初始化线程池必须调用否则线程池不生效 executor.initialize(); return executor; } }步骤二业务代码中注入并使用线程池Service public class ThreadPoolService { // 注入线程池Qualifier指定Bean的名称避免多个线程池时注入失败 Autowired Qualifier(customThreadPool) private Executor customThreadPool; // 业务方法中执行异步任务 public void doAsyncTask() { for (int i 1; i 5; i) { int finalI i; customThreadPool.execute(() - { System.out.println(Thread.currentThread().getName() 执行异步任务 finalI); try { Thread.sleep(1000); } catch (InterruptedException e) {e.printStackTrace();} }); } } }三、Spring线程池Async异步注解步骤1在配置类上添加EnbaleAsync注解开启异步支持Configuration EnableAsync public class SpringThreadPoolConfig { Bean(customThreadPool) public Executor customThreadPool() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(2); executor.setMaxPoolSize(5); executor.setQueueCapacity(10); executor.setKeepAliveSeconds(30); executor.setThreadNamePrefix(SPRING-THREAD-POOL-); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } }步骤2在业务方法上添加Async线程池Bean名注解Service public class AsyncTaskService { /** * 被Async注解的方法会被自动提交到指定的线程池异步执行 * 无需手动调用线程池Spring自动处理无感知 */ Async(customThreadPool) public void doAsyncTask(int taskId) { System.out.println(Thread.currentThread().getName() 执行异步任务 taskId); try { Thread.sleep(1000); } catch (InterruptedException e) {e.printStackTrace();} } }步骤3调用该方法即可同步调用异步执行Controller public class TaskController { Autowired private AsyncTaskService asyncTaskService; GetMapping(/task) public String doTask() { for (int i 1; i 5; i) { // 同步调用但方法内部会异步执行 asyncTaskService.doAsyncTask(i); } return success; } }线程池的种类1、newCachedThreadPool创建一个可缓存线程池如果当前线程池的长度超过了处理的需要时它可以灵活的回收空闲的线程。当需要增加的时候可以灵活的添加新的线程不会对线程的长度做出任何限制。2、newFixedThreadPool创建一个定长线程池,可以控制线程最大并发数超出的线程会在队列中等待。3、newScheduledThreadPool创建一个固定长度的线程池支持定时的以及周期性的任务执行4、newSingleThreadExecutor创建一个单线程化的线程池它只会用唯一的工作线程来执行任务如果这个唯一的线程因为异常结束那么会有一个新的线程来代替它它保证前一项任务执行完毕后才执行后一项。保证所有任务按照指定顺序执行。线程池的拒绝策略AbortPolicy,默认线程池的默认拒绝策略如果线程池满了丢掉这个任务并且抛出RejectedExecutionExcepitio异常DiscardPolicy是AbortPolicy的silent版本如果线程池队列满了会直接丢掉这个任务并且不会有任何异常。DiscardOldestPolicy丢弃最老的。如果队列满了会将最早进入队列的任务删掉腾出空间再尝试加入队列。CallerRunsPolicy如果添加到线程池失败那么调用线程会自己去执行该任务不会等待线程池中的线程去执行。