java 进程的参数和list的线程安全

在网上看了很多帖子,关于进程的参数话题很少,在普通类中使用进程,并将数据放入进程中存在这数据安全的问题。尤其在并发的过程中,容易导致数据的不一致

在类中方法中启用进程:

可以通过线程池的方式和线程的方式

public Robot analyRobot(String message){
Robot robot = new Robot();
try {
message= message.trim();
logger.info(message);
// logger.info(message.substring(message.length()-3,message.length()));
message =message.substring(message.indexOf("{\"")-1,message.length()-2);
JSONObject jsonObject = JSON.parseObject(message);
temp.add(jsonObject);
count++;
if (count >30 | flag) {
logger.info("缓存 :"+temp.size());
RobotRun robotRun = new RobotRun(temp);
robotRun.setList(temp);
// pool.execute(robotRun); 线程池的方式
new Thread(robotRun).start(); //线程的方式
count=0;
// logger.info("count :"+count);
}
}catch (Exception e){
logger.error("analyze para fail");
e.printStackTrace();
}
return robot;
}

线程中,可以通过重新构造函数的形式或者私有的静态边量的形式选择其一即可:其中在list的操作中以CopyOnWriteArrayList保障线程的安全

public class RobotRun implements Runnable {

@Autowired
private MongoTemplate mongoTemplate;

private static List<JSONObject> list = new CopyOnWriteArrayList<>();//静态变量

public static Logger logger = LoggerFactory.getLogger(RobotRun.class);

public RobotRun(List<JSONObject> list1) {//构造函数
list=list1;
mongoTemplate = (MongoTemplate) AllBeanService.getBean(MongoTemplate.class);
}

@Override
public void run() {
logger.info("list:"+list.size());
mongoTemplate.insert(list,"robot");
list.clear();
logger.info("添加成功:"+list.size());
}

public void setList(List<JSONObject> list) {
this.list = list;
}
}
posted @ 2021-05-12 14:43  李悠然  阅读(414)  评论(0编辑  收藏  举报