你把原来程序中直接读的地方,改成调用上面的函数,由该函数统一读行。这样,不管是你有 N 个线程,还是一个线程,都不会发生读的行重复,或者读的行不完整的现象了。
为了充分利用多线程读取,就需要把文件划分成多个区域,供每个线程读取。那么就需要有一个算法来计算出每个线程读取的开始位置和结束位置。那么首先根据配置的线程数和文件的总长度计,算出每个线程平均分配的读取长度。
但是有一点,由于文件是纯文本文件,必须按行来处理,如果分割点在某一行中间,那么这一行数据就会被分成两部分,分别由两个线程同时处理,这种情况是不能出现的。所以各个区域的结束点上的字符必须是换行符。第一个区域的开始位置是0,结束位置首先设为(文件长度/线程数),如果结束点位置不是换行符,就只能加1,直到是换行符位置。
如果多线程 *** 作,那么需要保证多个线程 *** 作同一个对象,此外请保证先有线程放进内容,其他线程才能拿出数据。
附上具体参考代码:
public class Test{
public static void main(String args[])throws Exception{
File file = new File("D:\\Test.java")//Text文件
BufferedReader br = new BufferedReader(new FileReader(file))//构造一个BufferedReader类来读取文件
String s = null
while((s = br.readLine())!=null){//使用readLine方法,一次读一行
System.out.println(s)
}
br.close()
}
}
貌似文件打开的时候会锁定住,这样另一个线程不能 *** 作了。我是这样理解的。但是你的写方法貌似没有检测文件是否被打开,没有检查是否锁定这一过程,这样如果一个线程在对文件进行 *** 作,另一个也在对文件进行 *** 作,这样就会出错。写文件很快的不太极端追求高实时性,不需要开新线程去写,可能还因为创建新线程还花更多的开销
另外多线程执行顺序确实不是可预测的,开了一堆线程,不能保证先开的线程就一定执行在最前,所以数据写入顺序是错的,可以理解
你可以把要写的文本添加到类似List<CString>中,往末尾追加,再开线程,线程去看List<CString>中有几个元素,没有就结束线程,有就从头元素开始写入文本文件,写完一个,删除头元素,再判断是否有元素,有就继续写头个元素,写完删,。。。。。。
这样就能保证写入顺序了,当然取出元素/删除元素时,要Section.Lock / Unlock
我喜欢用两个List<CString>,写的时候,标记下,让添加文本的都添加到另一个列表中,写完后,修改标记,以示切换这两个List,让添加文本的线程都添加到先前写完了的列表,写线程转去写另外一个列表
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)