进程同步的问题.

maoaq 2019-01-22 07:27:17
现在有两个进程,同时监控一个目录。每个进程做的事情一样,具体处理如下:
1 扫描文件夹,将扫描到的文件名放到一个list中。
2 遍历list,将文件copy到另外一个目录,每拷完一个就删除掉原来的。

现在要求每个文件只能拷贝一次,也就是只能被一个进程执行。

所以用了filelock来实现这个功能。

for(。。。。){
lock = filelock.trylock();
if(lock == null){
continue;
}
}

但是测试时发现,有的文件居然被执行了两遍,请问这是什么原因?猜测是由于要删除文件导致的。如果是这个原因,要怎样处理才好?
谢谢!
...全文
7829 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kk1924 2020-12-23
  • 打赏
  • 举报
回复
引用 8 楼 kk1924 的回复:
只有部分代码,没有log啥的,人家也不知道你的问题是什么。。。



楼主要学会贴代码和log
kk1924 2020-12-21
  • 打赏
  • 举报
回复
只有部分代码,没有log啥的,人家也不知道你的问题是什么。。。
冰思雨 2020-12-17
  • 打赏
  • 举报
回复
如果楼主胆子够大,还可以采用映射共享内存的形式。当然,开发难度也是指数级的增加了,一不小心就成功不了了。 https://www.cnblogs.com/nyatom/p/10770182.html
冰思雨 2020-12-17
  • 打赏
  • 举报
回复
FileLock 我印象中是对同一个文件的数据进行上锁的,楼主的应用场景应该是对文件整体上锁,这应该是两个概念。至少,我认为是两个概念。 我这里有一个思路,楼主可以尝试一下,看看是否可以行。 在临时文件夹中建立一个文本文件,楼主的 FileLock 对这个文件上锁,这个是个临时文件,保存正在操纵的文件名(全路径名)。 而楼主提到的两个进程,在对各自扫描到的文件进行拷贝和删除的过程时,不用上锁,但是,在拷贝和移动之前要对临时文件进行访问。 临时文件的访问过程如下: 1. 对临时文件上锁,并读取数据,读取正在操纵的文件名; 2. 将正在操纵的文件名与当前要拷贝删除的文件名做比较, 2.1. 若当前文件包含在正在操纵的文件名当中,则记录存在状态到一个boolean型变量中(假设 needMove = false;); 2.2. 若当前文件不在正在操纵的文件当中,则将当前文件的文件名追加到临时文件中(写入操作)(假设 needMove = true;); 3. 释放临时文件的文件锁,释放临时文件。 4. 根据 needMove 的值,是否对当前文件进行拷贝和删除操作。 4.1 若 needMove == true ,在拷贝和删除文件之后,要再次对临时文件上锁; 4.2 删除临时文件中 当前文件的文件名; 4.3 释放临时文件的文件锁,是否临时文件。 说明: 1. 锁,是用来解决互斥资源的访问的,但是,锁对象的选取不是必须要选择互斥资源本身。 2. 如果内存模型中的互斥资源本身,上锁解决不了问题,那么,可以自行定义互斥资源,将自定义资源映射到真实的互斥资源上面即可。 3. 上述方案中,对临时文件的上锁访问过程,不要写在循环结构之外,要写在循环体里面,每操作一个文件之前,查看一下临时文件,每操作一个文件之后,更新一下临时文件。 4. 临时文件,在多个进程的情况下,会有多个文件名进行保存,建议一行一个文件名。 5. 怎样删除一个文件名呢?推荐方案是:读取全部文件名,内存删除后,将结果覆盖写入临时文件。
生财 2020-12-17
  • 打赏
  • 举报
回复
启用子进程,子进程里带命令行参数,只监控指定的内容,处理完成后子进程自己杀掉自己,并通知主进程, 然后主进程再开子进程..不知道这样能不能满足楼主的场景
Hobo丶 2020-12-07
  • 打赏
  • 举报
回复
https://blog.csdn.net/weixin_43476969/article/details/103991634 可以参考下。
maoaq 2020-12-07
  • 打赏
  • 举报
回复
还有人知道吗?
十八道胡同 2019-01-23
  • 打赏
  • 举报
回复
你是两个进程来操作,你的锁是无法锁住跨进程的资源的。 你的锁只能在进程内起作用。 你可以两个进程 分片操作,比如进程1只处理文件创建时间最后的秒是奇数的文件。进程2只处理文件创建时间最后的秒是偶数的文件。
qq_39936465 2019-01-23
  • 打赏
  • 举报
回复
既然你要只能被一个进程执行,那你的锁就要锁在整个进程块的外面。


if (lock.tryLock()) {/*进程块*/}

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧