zoukankan      html  css  js  c++  java
  • 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;
    }
    }
  • 相关阅读:
    从txt读取数据到Cvmat
    PCA之后进行归一化
    vc中调用exe文件并传递参数
    C#安装包过程
    电脑技巧
    DLL文件的创建与调用
    SVM调用方法
    舌顶上腭位置与作用
    KNN算法的實現
    How to Read a Paper
  • 原文地址:https://www.cnblogs.com/youran-he/p/14759733.html
Copyright © 2011-2022 走看看