在使用线程池解决定时任务中批量数据的处理时,出现问题。
在写多线程处理对象的时候,通过传入的对象进行查询,但是因为多线程在线程池进行,会出现对象抢占问题,当线程1在处理数据的时候,线程2也开始数据处理,此时线程就会把该对象的某些值进行变化,线程1还没结束运行,此时对象的值出现了问题,导致后续的操作数据出现问题。
检测方法:通过日志查看,在每个循环里的最后打印出该对象的特殊值,如代码所示的mssSubProjectCode,在后台日志查看,若线程1在执行sql的时候显示的参数mssSubProjectCode(001),在线程1处理第二天sql时mssSubProjectCode变成(002),且线程2显示开启了,线程1还没结束,证明发生了抢占问题。
解决方法:
1.数据量不是很多时,可以选择单线程处理。
2.或者使用线程池的时候,对该对象重新建对象赋值,让每个线程都有独立的对象。