关于sheet线程安全问题

- (void)beginSheet:(NSWindow *)sheet modalForWindow:(NSWindow *)docWindow modalDelegate:(id)modalDelegate didEndSelector:(SEL)didEndSelector contextInfo:(void *)contextInfo

上面函数只能在主线程运行,在后台线程运行可能会有意想不到的异常。


同样,NSBeginSheet也一样。

### EasyExcel 实现多线程异步Sheet 的方法 为了实现多线程异步入 Excel 文件中的多个 Sheet,可以通过结合 Java 中的 `ExecutorService` 或者其他并发框架来完成。以下是具体的方法说明: #### 1. 创建线程池并分配任务 利用线程池管理多个线程的任务执行,每个线程负责向同的 Sheet 入数据。这种方式可以显著提高性能,尤其是在处理大量数据时。 ```java import com.alibaba.excel.EasyExcel; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MultiThreadWriteExample { public static void main(String[] args) { String fileName = "multi_thread_write.xlsx"; ExecutorService executorService = Executors.newFixedThreadPool(3); // 定义固定大小的线程池 // 向第一个Sheet入数据 Runnable task1 = () -> writeDataToSheet(fileName, 0); executorService.submit(task1); // 向第二个Sheet入数据 Runnable task2 = () -> writeDataToSheet(fileName, 1); executorService.submit(task2); // 关闭线程池 executorService.shutdown(); } private static void writeDataToSheet(String fileName, int sheetIndex) { EasyExcel.write(fileName).sheet(sheetIndex).doWrite(data()); } private static List<DemoData> data() { List<DemoData> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { DemoData demoData = new DemoData(); demoData.setString("字符串" + i); demoData.setDate(new Date()); demoData.setDoubleData(0.56); list.add(demoData); } return list; } } ``` 上述代码展示了如何创建一个固定大小为 3 的线程池,并分别提交两个任务到线程池中运行[^1]。每个任务会调用 `writeDataToSheet()` 方法,在同一个文件的Sheet入数据。 #### 2. 数据模型类定义 在实际应用中,通常需要定义一个实体类用于存储每条记录的数据结构。这里假设我们有一个简单的 `DemoData` 类作为例子。 ```java public class DemoData { @ExcelProperty("字符串标题") private String string; @ExcelProperty("日期标题") private Date date; @ExcelProperty("数字标题") private Double doubleData; // Getter 和 Setter 方法省略... } ``` 此部分代码展示了一个典型的 Entity 对象设计方式,其中包含了三个字段及其对应的注解配置[^3]。 #### 3. 注意事项 - **线程安全问题**:如果多个线程同时访问共享资源,则需要注意同步机制以防止竞争条件发生。 - **内存占用控制**:对于特别庞大的数据集来说,应该考虑分批入而是一次性加载全部内容至内存当中[^2]。 - **异常捕获与日志记录**:建议增加必要的错误检测逻辑以便于定位潜在的问题所在位置。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值