java 进程的参数和list的线程安全
Posted 李悠然
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}
}
以上是关于java 进程的参数和list的线程安全的主要内容,如果未能解决你的问题,请参考以下文章