1、配置文件中配置参数,可以动态增加
#参数 viewContent=432000 queryProductInfoEx=432000 viewContentType=432000
2、利用线程同步文件中的配置数据,可以重构成单例模式。
package com.mport.common; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; /** * 配置过效时间 * * @author Administrator * */ public class ParamSynFile { private static Logger log = Logger.getLogger(ParamSynFile.class); private static long expireTimeLastModifyTime = 0, phoneNumsInWhitePaperLastModifyTime = 0; private Map<String, Integer> expireTimeMap = new HashMap<String, Integer>(); private List<String> phoneNumsInWhitePaper = new ArrayList<String>(); private ExecutorService threadPool = Executors.newFixedThreadPool(1); private String expireTimeLastFilePath = null, phoneNumsInWhitePaperFilePath = null; public ParamSynFile() { expireTimeLastFilePath = ParamSynFile.class.getClassLoader().getResource("memcache_expire_time.txt").getFile(); File file = new File(expireTimeLastFilePath); // phoneNumsInWhitePaperFilePath = ParamSynFile.class.getClassLoader().getResource("phone_numbers_in_white_paper.txt").getFile(); // File phoneNumsInWhitePaperFile = new File(phoneNumsInWhitePaperFilePath); FileInputStream in = null; try { in = new FileInputStream(file); expireTimeMap = readExpireTimeConfigFile(in); // in = new FileInputStream(phoneNumsInWhitePaperFile); // phoneNumsInWhitePaper = readNumsInWhitePaperFile(in); Thread synFileThread = new Thread(new Runnable() { public void run() { FileInputStream in = null; File expireTimeLastFile = null; // File phoneNumsInWhitePaperFile = null; while (true) { try { try { // 读取memcache的过期在时间配置参数 expireTimeLastFile = new File(expireTimeLastFilePath); long expireTimeLastModifyTime1 = expireTimeLastFile.lastModified(); if (expireTimeLastModifyTime == 0 || expireTimeLastModifyTime < expireTimeLastModifyTime1) { expireTimeLastModifyTime = expireTimeLastModifyTime1; log.info("memcache_expire_time.txt last modify time:" + expireTimeLastModifyTime); in = new FileInputStream(expireTimeLastFile); expireTimeMap = readExpireTimeConfigFile(in); log.info("memcache_expire_time.txt new config: " + expireTimeMap.toString()); } // 读取白名单用户 // phoneNumsInWhitePaperFile = new File(phoneNumsInWhitePaperFilePath); // long phoneNumsInWhitePaperLastModifyTime1 = phoneNumsInWhitePaperFile.lastModified(); // if (phoneNumsInWhitePaperLastModifyTime == 0 || phoneNumsInWhitePaperLastModifyTime < phoneNumsInWhitePaperLastModifyTime1) { // phoneNumsInWhitePaperLastModifyTime = phoneNumsInWhitePaperLastModifyTime1; // log.info("phone_numbers_in_white_paper.txt last modify time:" + phoneNumsInWhitePaperLastModifyTime); // in = new FileInputStream(phoneNumsInWhitePaperFile); // phoneNumsInWhitePaper = readNumsInWhitePaperFile(in); // log.info("phone_numbers_in_white_paper.txt new numbers: " + phoneNumsInWhitePaper.toString()); // } } catch (Exception e) { e.printStackTrace(); } finally { if (in != null) { in.close(); } } Thread.sleep(10 * 1000); } catch (Exception e) { e.printStackTrace(); } } } }); threadPool.execute(synFileThread); } catch (Exception e) { e.printStackTrace(); } finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } public ParamSynFile(int i) { } /** * 读取白名单用户 * * @param in * @return * @throws Exception */ private static List<String> readNumsInWhitePaperFile(InputStream in) throws Exception { List<String> phoneNumsInWhitePaper = new ArrayList<String>(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String buf = null; Pattern pattern = Pattern.compile("(\\d+)"); while ((buf = reader.readLine()) != null) { Matcher matcher = pattern.matcher(buf); if (matcher.find() && NumberUtils.isNumber(matcher.group(1))) { phoneNumsInWhitePaper.add(matcher.group(1)); } } return phoneNumsInWhitePaper; } /** * 读取memcache的过期在时间配置参数 * * @param in * @return * @throws Exception */ private static Map<String, Integer> readExpireTimeConfigFile(InputStream in) throws Exception { Map<String, Integer> expireTimeMap = new Hashtable<String, Integer>(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String buf = null; Pattern pattern = Pattern.compile("(\\w+)=(\\d+)"); while ((buf = reader.readLine()) != null) { Matcher matcher = pattern.matcher(buf); if (matcher.find() && NumberUtils.isNumber(matcher.group(2))) { expireTimeMap.put(matcher.group(1), NumberUtils.toInt(matcher.group(2))); } } return expireTimeMap; } public Integer getExpireTime(String key) { Integer exp = expireTimeMap.get(key); if (exp == null || exp < 0) { exp = 0; } return exp; } public List<String> getPhoneNumsInWhitePaper() { return phoneNumsInWhitePaper; } @Override protected void finalize() throws Throwable { threadPool.shutdown(); expireTimeMap = null; phoneNumsInWhitePaper = null; super.finalize(); } public static void main(String[] args) { // MemcacheExpireTimeConfig config = MemcacheExpireTimeConfig.getInstance(); // while(true){ // System.out.println(config.getExpireTime("viewContent")); // System.out.println("PhoneNumsInWhitPapaer size:" + config.getPhoneNumsInWhitPapaer().size()); // try { // Thread.currentThread().sleep(1000); // } catch (InterruptedException e) { // e.printStackTrace(); // } // } } }
相关推荐
此外,开发过程中,IDE如IntelliJ IDEA和Eclipse的源码管理和项目配置文件(如`.classpath`和`.project`)也能帮助我们更好地组织和理解代码。 在实际应用中,还需要注意线程安全问题,例如避免多个线程同时修改...
在读取配置文件的方法中,使用了`synchronized`关键字,确保多线程环境下对`HashMap`的操作是线程安全的。这是因为配置文件的读取可能会在多线程环境中发生,如果不加控制,可能会导致数据不一致或者读取失败。 ###...
在Java编程中,读取配置文件是常见的任务,特别是在构建可扩展和可维护的应用程序时。配置文件通常用于存储应用程序的设置、连接信息或其他敏感数据,这样可以将这些信息与核心代码分离,便于管理和更新。本篇文章将...
`Properties`类用于处理键值对,它是Java中读取配置文件的标准方式。 要获取配置文件中的数据,我们可以调用`Singleton.INSTANCE.getProperties()`。例如,如果配置文件中有`database.url`属性,我们可以通过以下...
多线程循环读取csv文件执行请求以及CSV Data Set Config配置信息,如有什么疑问,可以在博客下留言,https://blog.csdn.net/u012811841/article/details/108710930
这个项目实现了一个基础但功能全面的Python爬虫,它集成了命令行处理、多线程、日志管理和配置文件读取等功能。 首先,命令行处理允许用户通过终端命令行参数来控制爬虫的行为。例如,用户可以指定爬取的起始URL、...
在Microsoft Foundation Classes (MFC)库中,读取和写入`.ini`配置文件是常见的任务,主要用于存储应用程序的设置和用户偏好。`.ini`文件是一种简单文本格式,用于保存程序的状态信息。在这个"MFC中读取ini配置文件...
在IT行业中,配置文件的管理和使用是至关重要的,特别是在自动化测试、设备控制和软件集成等领域。本主题聚焦于如何在LabVIEW(Laboratory Virtual Instrument Engineering Workbench)环境中处理配置文件,特别是...
启动线程“读取参数”线程:执行100次 读取参数功能。 启动线程“模拟图像处理”线程:执行100次 模拟图像处理。 运行预期结果: File文件夹中有0到100共101个文件。 img有约80个文件。 img有的文件,File文件夹中...
海康网络相机利用SDK进行多线程读取图像的程序设计是一个高级的计算机视觉与图像处理技术,主要涉及以下几个核心知识点: 1. **海康威视SDK**:海康威视是全球知名的安防设备制造商,提供了丰富的SDK(Software ...
这个项目是一个基于MFC开发的FTP文件上传工具,它具有读取配置文件的能力,这在实际应用中非常实用。 首先,让我们详细探讨MFC。MFC提供了大量的类,如CWinApp、CWnd、CButton等,这些类对应于Windows操作系统中的...
最后,在主程序中,我们从配置文件`conf.ini`读取文件名和线程数量。然后,我们创建一个`Partition`对象,调用`part`方法获取分块信息。接着,根据这些信息创建并启动多个`Reader`线程,每个线程处理一个文件块。 ...
读取配置文件的基本步骤通常包括打开文件、解析内容、提取所需信息。例如,在Python中,读取一个.ini文件的代码可能如下: ```python import configparser config = configparser.ConfigParser() config.read('...
当需要从配置文件中读取数据时,可以使用`value`方法。如果设置项不存在,该方法会返回默认值(如果提供了默认值参数),或者返回QVariant类型的未定义值: ```cpp QString myString = settings.value("myString...
本主题将深入探讨如何使用多线程来优化文件的读取和写入过程,以及需要注意的相关问题。 首先,我们需要理解单线程与多线程在文件操作中的区别。在单线程环境下,文件读写通常是顺序执行的,这意味着如果一个任务...
7. **线程间通信**:使用`BlockingQueue`或`Future`可以实现线程间的通信,例如,一个线程负责读取文件块并放入队列,另一个线程从队列中取出并发送。 8. **性能调优**:合理设置线程池大小、考虑使用NIO(非阻塞I/...
### Visual C++ 利用互斥量同步线程实现文件读取进度条 #### 一、背景介绍 在开发基于Visual C++的应用程序时,文件读取操作常常伴随着进度显示的需求,以提升用户体验。传统的进度条更新方式是在读取文件的过程中...
在读取配置文件时,我们需要考虑错误处理,例如文件不存在、权限问题或格式不正确的情况。确保在读取过程中使用适当的错误检查机制,以确保程序的健壮性。 其次,让我们转向debug日志记录。在软件开发过程中,日志...
在C语言编程中,配置文件读取和调试日志记录是两个重要的功能模块,它们在软件开发中扮演着不可或缺的角色。下面将详细讲解这两个知识点。 ### 配置文件读取 配置文件通常用来存储应用程序的参数、设置或环境变量...
MySQL配置文件解析主要涉及到MySQL服务器的参数调整,这些参数直接影响数据库的性能和稳定性。配置文件通常命名为`my.cnf`或`my.ini`,在不同的操作系统路径可能不同。以下是几个关键参数的解释: 1. `port`:指定...