spring中的@Async @EnableAsync注解及线程池

spring对多线程做了很好的支持.主要有@Async @EnableAsync注解.

@Async.直接加在方法上,调用该方法时会自动创建一个线程.线程池默认使用SimpleAsyncTaskExecutor.不重用线程,每次调用都会创建一个新的线程.所以单单使用@Async可能会产生并发问题.需要自定义线程池.使用@Async有以下几个注意事项:

1.要异步执行的方法加上@Async

2.调用异步方法需要配置上注解@EnableAsync.可以在spring入口类加注解,也可以在需要调用异步方法的类上注解也可以直接在配置类加.

3.异步方法不能和调用方法放在一个类里面,必须不同类间调用,所以,很显然异步方法都是public.

4. 在@Async标注的方法,同时也适用了@Transactional进行了标注的情况;在其调用数据库操作之时,将无法产生事务管理的控制,原因就在于其是基于异步处理的操作。 那该如何给这些操作添加事务管理呢?可以将需要事务管理操作的方法放置到异步方法内部,在内部被调用的方法上添加@Transactional.

5.不自定义异步方法的线程池默认使用SimpleAsyncTaskExecutor.SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。并发大的时候会产生严重的性能问题.

6.@Async注解一般用在类的方法上,如果用在类上,那么这个类所有的方法都是异步执行的;

7.返回值:需要返回值用AsyncResult或者CompletableFuture

8.@Async默认使用Bean Name为executor的线程池。也可以根据Bean Name指定特定线程池.

9.线程池:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。spring中可以写一个线程池的配置类交给spring管理.为了提高项目的健壮性,不同业务配置不同线程池.

@Bean
    public Executor asyncServiceExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //ThreadPoolTaskExecutor executor = new VisiableThreadPoolTaskExecutor();

        //配置核心线程数,线程池维护线程的最少数量
        executor.setCorePoolSize(5);

        //配置最大线程数,线程池维护线程的最大数量
        executor.setMaxPoolSize(5);

        //配置队列大小,缓存队列
        executor.setQueueCapacity(99999);

        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("async-service-");

        // rejection-policy:当pool已经达到max size的时候,如何处理新任务

        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行

        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

        //允许的空闲时间 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize
        //executor.setKeepAliveSeconds(1);

        //执行初始化
        executor.initialize();

        return executor;

    }
Vue 3中的Element UI Plus是一个基于Vue 3的组件库,它是Element UI的升级版本,提供了许多现代化的UI组件,包括`el-table`。在`el-table`中实现虚拟滚动(Virtual Scroll)是一种优化大数据量表格渲染的技术,它通过只渲染可视区域内的行来提高性能。 在Vue 3的Element UI Plus中,实现虚拟滚动可以通过`v-infinite-scroll`指令来完成。这个指令允许你在表格滚动到接近底部时触发加载更多数据的操作,而不需要一次性加载所有数据。然而,需要注意的是,Element UI Plus本身并不直接提供一个虚拟滚动实现,你可能需要结合其他的虚拟滚动库,比如`v-virtual-scroller`,来实现这一功能。 使用虚拟滚动库,你可以将`el-table`包裹在虚拟滚动组件中,并提供必要的数据和方法来处理数据的加载和渲染。这样可以显著减少DOM操作,提高大数据量表格的渲染性能。 以下是使用虚拟滚动的一个基本示例: ```vue <template> <v-virtual-scroller :data="tableData"> <template v-slot="{ item }"> <el-table :data="item" style="width: 100%"> <!-- 表格列定义 --> <el-table-column prop="date" label="日期" width="180"></el-table-column> <!-- 其他列定义 --> </el-table> </template> </v-virtual-scroller> </template> <script> import { ref } from 'vue'; import { ElTable, ElTableColumn } from 'element-plus'; import { VVirtualScroller } from 'v-virtual-scroller'; export default { components: { VVirtualScroller, ElTable, ElTableColumn }, setup() { const tableData = ref([]); // 假设这里有一个方法来加载数据 const loadData = () => { // 更新tableData或分页加载更多数据 }; return { tableData, loadData }; } }; </script> ``` 在上述示例中,`v-virtual-scroller`是虚拟滚动组件,`el-table`是Element UI Plus的表格组件,它会根据数据更新来动态渲染表格的每一行。`v-slot`指令用于定义虚拟滚动的内容模板,其中`item`代表每个渲染的行的数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值