码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2021-05-24 06:50:27      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:span   etl   exce   run   oid   stat   exe   read   robot   

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

在类中方法中启用进程:

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

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的线程安全

标签:span   etl   exce   run   oid   stat   exe   read   robot   

原文地址:https://www.cnblogs.com/youran-he/p/14759733.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!