Java线程池结合ThreadLocal的用法实例

本文介绍了如何使用Java线程池和ThreadLocal处理并发插入数据时的唯一性约束。在解决线程间共享变量问题时,通过ThreadLocal避免了公有变量的冲突,同时也指出了在使用ThreadLocal时需要注意的生命周期问题和内存管理,包括及时清理ThreadLocal变量以防止内存泄漏。通过示例展示了如何正确使用ThreadLocal,最终成功在6-7分钟内完成向数据库插入100万条数据的任务。
摘要由CSDN通过智能技术生成

今天由于老大让我向数据库中添加百万条数据用来做测试,考虑到单线程插入数据可能要花很久的时间,于是想到了用线程池来进行插入操作,但是里面有个一个唯一性约束字段,然后在这个过程中遇到了好几个问题:

  1. 一开始使用线程池的时候由于唯一性约束字段的存在,需要将一个公有变量变成私有变量(每个线程在执行过程中变量需要不被外界修改),但是线程池中的线程是通过实现Runnable接口方式创建的,那么类中的私有变量其实是公有变量。
  2. 了解到ThreadLocal的用法后,也踩了几次坑,这里总结一些ThreadLocal的用法:尽量使用private static声明ThreadLocal变量;出main线程外,只有在run()中才能调用到TheadLocal变量(run中调用的其他方法中也能调用到,一开始将其放在在MyThread类的构造方法中,一直有NPE报出),说明只有在run()中,这个线程才算真正有了自己的生命周期。
  3. 线程数和循环次数不要太狠,尤其是在添加了对象到List中的时候,很容易出现内存不足异常。
  4. ThreadLocal变量在不需要当前存放的值的时候,必须使用remove方法清除,这点也是一个大坑,下面主要是介绍这个坑以及解决方法。
  5. 调用线程池的shutdown()方法意味着该线程池在线程池中的所有线程执行完毕后就“关机了”,将不再接受任何调用。

(1)在线程中执行添加一段连续的Integer到List中;
(2)(1)中的Integer不能是重复的;
(3)在main中向线程池中添加10条线程,并启动它们;
(4)线程池中的每条线程循环执行10次;
未使用remove()的代码(其实也就是我注释了remove)如下:

public class ThreadLocalTest {
   
    static Integer initNum = 1; //初始数据
    static int step = 10; //步长
    static int threads = 10; //线程数
    private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
    public static 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值