日期:2014-05-20  浏览次数:20754 次

java多线程读文件的困惑
小弟线程刚入门 想做个demo 多线程读文件 然后写出来
文件有500行 我想分5个线程读 每个线程 我在主文件里面设置一个Vector 然后构造读文件类的时候把Vector传进去
构造线程时候使用for循环把i传进去 确定改线程读取的行数例如 i=0 则是读1-100行 以此类推
然后在主程序里执行一个操作 把Vector里面的内容写进另外一个文件 
但是为什么我每次都是100-200行 都不到500行 
而且线程数越多得到行数也多

请高手指点下啊

------解决方案--------------------
你第一个线程读1-100,读了100行。
第二个线程去读100-200,此时第二个线程为了知道要从第100行开始读,那他不是还是要1-100-200;还是读了200行!
如此总感觉有点费时间,多线程速度并没有块起来!
------解决方案--------------------
你在粘代码的时候设一下是JAVA代码就好了,看一下回复工具栏上有,
从你的代码看出来,你原先应该是写C或C++的吧

cthb 类的run()和ReadFileMultiLine()方法要改一下,因为ReadFileMultiLine()根本没起到应想的作用而且引起了你的这个BUG,我这里给你稍改了一下,能保证正确,但你还是自己改得再优美一些吧,我把ReadFileMultiLine()方法改去掉了,只修改了run()方法
Java code

    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,但是,操作系统都会为每个线程分配时间片的,这样,对于同一个文件,就会有多个时间片来处理文件的内容。