网站建设系统服务机构万网域名注册官网邮箱
news/
2025/9/27 5:40:31/
文章来源:
网站建设系统服务机构,万网域名注册官网邮箱,网站建设备案图片,wordpress门户源码在异步任务执行的时候#xff0c;我们知道其背后都有一个线程池来执行任务#xff0c;但是为了控制异步任务的并发不影响到应用的正常运作#xff0c;我们需要对线程池做好相关的配置#xff0c;以防资源过度使用。这个时候我们就考虑将线程池进行隔离了。
那么我们为啥要…在异步任务执行的时候我们知道其背后都有一个线程池来执行任务但是为了控制异步任务的并发不影响到应用的正常运作我们需要对线程池做好相关的配置以防资源过度使用。这个时候我们就考虑将线程池进行隔离了。
那么我们为啥要隔离Async异步任务的线程池 控制资源通过隔离异步任务的线程池可以更好地控制系统的资源使用。不同类型的异步任务可能对系统资源的需求不同例如某些任务可能需要更多的线程数或更大的队列容量。通过隔离线程池可以为每种类型的任务分配适当的资源避免资源争用和过度消耗。 优化性能隔离异步任务的线程池可以帮助优化系统的性能。如果所有的异步任务共享同一个线程池当某个任务出现阻塞或执行时间过长时可能会影响其他任务的执行。通过隔离线程池可以确保每个任务都有独立的线程池资源提高系统的并发能力和响应性能。 业务隔离有时候不同的业务逻辑可能需要不同的异步任务处理方式。通过隔离线程池可以为每个业务逻辑定义独立的线程池以满足不同业务的需求。例如某些任务可能需要更高的优先级或更短的超时时间而另一些任务可能需要更大的线程池容量。通过隔离线程池可以更好地管理和调整每个业务逻辑的异步任务执行环境。
下面看一个demo
demo 创建自定义的线程池首先你可以创建一个自定义的线程池用于处理Async注解标记的异步任务。可以使用ThreadPoolTaskExecutor类来创建线程池。 Configuration
EnableAsync
public class AsyncConfig implements AsyncConfigurer {Bean(name asyncTaskExecutor)public Executor asyncTaskExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();// 配置线程池属性executor.setCorePoolSize(10);executor.setMaxPoolSize(20);executor.setQueueCapacity(100);executor.setThreadNamePrefix(AsyncTask-);executor.initialize();return executor;}Overridepublic Executor getAsyncExecutor() {return asyncTaskExecutor();}
}在上述示例中我们创建了一个名为asyncTaskExecutor的线程池并配置了核心线程数、最大线程数、队列容量等属性。 在异步任务方法上指定线程池接下来你可以在需要异步执行的方法上使用Async注解并通过value属性指定要使用的线程池。 Service
public class MyService {Async(asyncTaskExecutor)public void asyncMethod() {// 异步任务的具体逻辑}
}在上述示例中我们使用Async(asyncTaskExecutor)注解将asyncMethod()方法标记为异步任务并指定了使用名为asyncTaskExecutor的线程池。
实际案例
记得在启动类中添加EnableAsync注解呀
我们来初始化多个线程池
EnableAsync
Configuration
public class TaskPoolConfig {Beanpublic Executor taskExecutor1() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(2);executor.setMaxPoolSize(2);executor.setQueueCapacity(10);executor.setKeepAliveSeconds(60);//使用线程名前缀可以用来观察顺序executor.setThreadNamePrefix(executor-1-);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}Beanpublic Executor taskExecutor2() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(2);executor.setMaxPoolSize(2);executor.setQueueCapacity(10);executor.setKeepAliveSeconds(60);executor.setThreadNamePrefix(executor-2-);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}
}
接下来创建一个异步任务然后指定要使用线程池名字。
Slf4j
Component
public class AsyncTasks {public static Random random new Random();Async(taskExecutor1)public CompletableFutureString doTaskOne(String taskNo) throws Exception {log.info(开始任务{}, taskNo);long start System.currentTimeMillis();Thread.sleep(random.nextInt(10000));long end System.currentTimeMillis();log.info(完成任务{}耗时{} 毫秒, taskNo, end - start);return CompletableFuture.completedFuture(任务完成);}Async(taskExecutor2)public CompletableFutureString doTaskTwo(String taskNo) throws Exception {log.info(开始任务{}, taskNo);long start System.currentTimeMillis();Thread.sleep(random.nextInt(10000));long end System.currentTimeMillis();log.info(完成任务{}耗时{} 毫秒, taskNo, end - start);return CompletableFuture.completedFuture(任务完成);}}
创建一个测试类
Slf4j
SpringBootTest
public class ApplicationTests {Autowiredprivate AsyncTasks asyncTasks;Testpublic void test() throws Exception {long start System.currentTimeMillis();// 线程池1CompletableFutureString task1 asyncTasks.doTaskOne(1);CompletableFutureString task2 asyncTasks.doTaskOne(2);CompletableFutureString task3 asyncTasks.doTaskOne(3);// 线程池2CompletableFutureString task4 asyncTasks.doTaskTwo(4);CompletableFutureString task5 asyncTasks.doTaskTwo(5);CompletableFutureString task6 asyncTasks.doTaskTwo(6);// 一起执行CompletableFuture.allOf(task1, task2, task3, task4, task5, task6).join();long end System.currentTimeMillis();log.info(任务全部完成总耗时 (end - start) 毫秒);}}在上面的单元测试中一共启动了6个异步任务前三个用的是线程池1后三个用的是线程池2。
先不执行根据设置的核心线程2和最大线程数2我们来猜猜线程的执行顺序。 线程池1的三个任务task1和task2会先获得执行线程然后task3因为没有可分配线程进入缓冲队列 线程池2的三个任务task4和task5会先获得执行线程然后task6因为没有可分配线程进入缓冲队列 任务task3会在task1或task2完成之后开始执行 任务task6会在task4或task5完成之后开始执行
执行结果 通过以上步骤你可以实现对Async异步任务的线程池进行隔离。这样可以根据需要创建多个线程池并为不同的异步任务指定不同的线程池以实现任务之间的隔离和资源控制。通过隔离Async异步任务的线程池可以实现对系统资源的控制、性能的优化和业务逻辑的隔离。这样可以提高系统的稳定性、可伸缩性和灵活性更好地满足不同业务场景下的需求。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919097.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!