作者tnsshnews (tnsshnews)
看板java
标题[问题] Java Multithreading Writ/Read/CreateFile
时间Mon Oct 22 11:16:36 2012
Dear all,
小弟为Multithreading新手一位, 过去鲜少写过多执行序的问题。
目前程式执行需要三个执行序:
Thread-1: 持续监听网路封包
Thread-2: 一有新封包接收到, 立刻写入档案
Thread-3: 每隔五分钟产生一个新档案(.bak), 任何新收到的封包,写入最产生的档案里,
等一个五分钟的新档案产生之後, 上一个档案的.bak便取消掉
(.bak的目的是确保该档案目前还未关闭)
小弟目前做法是:
Thread-1: 每个几秒钟, 就询问server, 是否有新封包, 如果有, 便一直塞入List中
Thread-2: 利用loop一直扫描Thread-1的List, BufferWriter写入档案, 并将以写入档案的资料从List删除(确保List中资料都是未写入档案的)
Thread-3: 每隔五分钟产生新档案(.bak), 并将五分钟内接收的新资料写入该档案,
下一个五分钟产生新档案时, 将上一个五分钟产生的档案改档名(取消.bak), 关闭BufferWriter指向,
并将Thread-2的BufferWriter指向新的档案(新的.bak)
目前已经完成差不多, 但测试时发现多问题
1. 如果一边有新资料进来, 一边又写入档案, 会不会造成非同步呢?
目前我是将写过的资料, 从List删除, 这样可确保留在List的资料都是尚未写入的,
但总觉得这样写很不漂亮!!
2. 因为每五分钟换一次档案, 所以写档案的Thread, 不会关掉BufferWriter, 但没关掉
就不能改档名。目前机制是, 还没有换档前, 档案一直会有新资料写进来,
因为产生的档案是要给另一只程式读的, 为了避免另一只程式不会读到不完整的资料,
所以采取这样的手法, 但也觉得这样不够漂亮@@
感激不尽!!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.79.199.63
1F:→ cha122977:不知道Observer pattern(观察者模式)适不适合 10/22 13:03
2F:推 PsMonkey:看到原 po 跑去 CodeJob 发案,我开始不懂了... 10/22 15:22
3F:→ PsMonkey:所以原 po 是想要问什麽?看起来不像完全没东西阿? 10/22 15:23
4F:→ tnsshnews:有东西 10/22 17:40
5F:→ tnsshnews:谁能救救我QQ 10/22 17:41
6F:→ PsMonkey:==.=== 逻辑都出来了,是哪里写不出来? 10/22 17:43
7F:→ tnsshnews:就是改档案的地方, 档名改不掉, 10/22 17:45
8F:推 No:终於讲出问题了,我刚还在想问题是不是thread-safe 10/22 17:46
9F:→ tnsshnews:结果是因为写档案是bufferwriter没有close 10/22 17:47
10F:→ tnsshnews:但close buffer就不能写档案了@@ 10/22 17:49
11F:→ tnsshnews:救命啊!! 10/22 17:50
※ 编辑: tnsshnews 来自: 203.79.199.63 (10/22 18:02)
12F:推 PsMonkey:那就重新打开阿? 你这样子问问题喊救命,我就要锁文了 10/22 17:56
13F:→ PsMonkey:==.=== 就要 Thread-3 启动时等 Thread-2 关掉之後再作 10/22 18:29
※ 编辑: tnsshnews 来自: 180.218.158.208 (10/22 20:05)