• 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;
    }
    }
  • 相关阅读:
    2021年欺骗式防御技术将迎来爆发
    可以简化决策过程的10个大数据源
    “AI+”改变世界!不同领域的5大人工智能趋势
    预测2021: 区块链领域新景观
    后量子时代的密码学
    考试
    进度总结8
    进度总结7
    进度总结6
    进度总结5
  • 原文地址:https://www.cnblogs.com/youran-he/p/14759733.html
Copyright © 2020-2023  润新知