日期:2014-05-20 浏览次数:20754 次
public void run() { int start_row = this.record_count * this.thread_count; int end_row = start_row + record_count; int i=0; String tempStr=""; try { while(i <start_row && gfile.readLine()!= null) { i++; } while(i<end_row && ((tempStr=gfile.readLine())!= null)) { this.tmal.add(tempStr+","+i); i++; } this.gfile.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
------解决方案--------------------
涉及到文件的随机访问。要使用java.io.RandomAccessFile类。
看待文件的观念要转变,文件的长度是要用Byte来衡量的,不要使用行数来衡量。
文件的多线程访问,要顺次拆分文件。首先要知道文件的总长度,以及要使用的线程数量。
其次,确定每个线程访问同一个文件的起始点和结束点,楼主可能是因为这个没有算好,才会出错。
读取的数据,也要注意存放的位置问题,按照楼主的思路,最好是每个线程一个数据区,然后等每个线程都读取完毕后,由主线程将每个数据区的内容按照前后顺序依次写入同一个文件。如果所有线程都使用同一个数据区,数据的顺序很容易被打乱,因为,多线程是并发处理的。
注意:确定RandomAccessFile类的对象,是否是线程安全的,如果不是,要每一个线程分别创建自己的RandomAccessFile对象。
多线程读取同一个文件,要比单线程读取一个文件的效率是要高的。虽然,每个线程都使用的是同一个进程所占有的IO,但是,操作系统都会为每个线程分配时间片的,这样,对于同一个文件,就会有多个时间片来处理文件的内容。