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

解决方案 »

  1.   

    我就是想做个简单的多线程拷贝文件的程序
    不同线程从不同的行开始读  例如文件总共有500行 那我就分5个线程 第一个线程都1-100行 第二个读101-200行 直到第五个读401-500行
    我把这些读出来的数据都以String保存到Vector中去 然后再输出到目标文件里面 现在问题是我执行之后目标文件行数远小于500行(大概20多行)  而且你如果刚开始线程分的越多(例如我不是分5个 分成10个 20个 30个)行数就会越多 但是还是小于500(100+行)这个是为什么啊?
      

  2.   

    没抛出什么异常么?
    多线程读文件,DAO的读取方法应该同步
      

  3.   

    多线程运行的时候如果数据共享,可能存在篡改其他线程中的数据!
    所以你要加对象锁!再者你也不能控制永远是第一个,第二个线程,。。依次同时的运行,如果第二个线程
    比第一个提早了,Vector中数据顺序就出错了!
      

  4.   

    恩 顺序我考虑到的 我在每个String后面都加上行数了  一下就是我的一次运行的结果 逗号后面的行数 现在还没有整理和排序type_1_510100/_010200000000/,1
    type_1_500000/_010200000000/,2
    type_5_500000/_010200000000/,3
    type_10_500000/_010200000000/,4
    type_16_500000/_010200000000/,5
    type_1_460100/_010200000000/,6
    type_8_500000/_010200000000/,11
    type_2_469000/_010200000000/,12
    type_1_450700/_010200000000/,13
    type_1_513400/_010200000000/,14
    type_1_511100/_010200000000/,15
    type_1_431100/_010200000000/,16
    type_3_430100/_010200000000/,17
    type_1_445200/_010200000000/,18
    type_2_440600/_010200000000/,19
    type_1_620600/_010200000000/,20
    type_18_500000/_010200000000/,21
    type_2_450300/_010200000000/,22
    type_2_511300/_010200000000/,23
    type_2_430700/_010200000000/,24
    type_3_450100/_010200000000/,25
    type_1_441600/_010200000000/,26
    type_1_420800/_010200000000/,27
    type_2_532500/_010200000000/,28
    type_1_610700/_010200000000/,29
    type_1_230800/_010200000000/,30
    type_1_451400/_010200000000/,31
    type_2_513300/_010200000000/,32
    type_2_440200/_010200000000/,33
    type_2_440100/_010200000000/,34
    type_3_610900/_010200000000/,35
    type_1_530700/_010200000000/,36
    type_1_542600/_010200000000/,37
    type_1_220100/_010200000000/,38
    type_4_321000/_010200000000/,39
    type_1_150300/_010200000000/,40
    type_1_450900/_010200000000/,7
    type_1_450300/_010200000000/,8
    type_1_513400/_010200000000/,9
    type_2_513300/_010200000000/,10
    type_1_450500/_010200000000/,41
    type_1_431200/_010200000000/,42
    type_2_441800/_010200000000/,43
    type_2_421100/_010200000000/,44
    type_1_522600/_010200000000/,45
    type_2_230700/_010200000000/,46
    type_2_320300/_010200000000/,47
    type_1_150400/_010200000000/,48
    type_2_411300/_010200000000/,49
    type_1_350500/_010200000000/,50
    type_2_511000/_010200000000/,71
    type_1_440400/_010200000000/,72
    type_2_522700/_010200000000/,73
    type_1_330200/_010200000000/,74
    type_1_140900/_010200000000/,75
    type_1_360600/_010200000000/,76
    type_1_511800/_010200000000/,61
    type_1_445100/_010200000000/,62
    type_1_650200/_010200000000/,63
    type_1_540100/_010200000000/,64
    type_1_211200/_010200000000/,65
    type_1_410400/_010200000000/,66
    type_1_360200/_010200000000/,67
    type_1_511400/_010200000000/,51
    type_3_430100/_010200000000/,52
    type_1_622800/_010200000000/,53
    type_1_533300/_010200000000/,54
    type_1_230400/_010200000000/,55
    type_1_140400/_010200000000/,56
    type_2_410300/_010200000000/,57
    type_1_410200/_010200000000/,58
    type_1_430400/_010200000000/,81
    type_1_620600/_010200000000/,82
    type_2_542300/_010200000000/,83
    type_1_211400/_010200000000/,84
    type_1_410700/_010200000000/,85
    type_1_430800/_010200000000/,91
    type_1_652700/_010200000000/,92
    type_1_220600/_010200000000/,93
    type_1_370800/_010200000000/,94
    type_2_350300/_010200000000/,95
    type_2_430200/_010200000000/,101
    type_1_532300/_010200000000/,102
    type_2_320600/_010200000000/,103
    type_2_411300/_010200000000/,104
    type_1_620100/_010200000000/,111
    type_2_522300/_010200000000/,112
    type_1_130400/_010200000000/,113
    type_1_360300/_010200000000/,114
    type_1_445300/_010200000000/,121
    type_1_542600/_010200000000/,122
    type_1_141000/_010200000000/,123
    type_3_440700/_010200000000/,141
    type_1_330600/_010200000000/,142
    type_1_341100/_010200000000/,143
    type_1_441500/_010200000000/,131
    type_1_230800/_010200000000/,132
    type_1_330700/_010200000000/,133
    type_1_632200/_010200000000/,151
    type_1_231000/_010200000000/,152
    type_2_350800/_010200000000/,153
    type_1_622400/_010200000000/,161
    type_1_130700/_010200000000/,162
    type_1_652300/_010200000000/,171
    type_3_130100/_010200000000/,172
    type_1_653000/_010200000000/,181
    type_1_150300/_010200000000/,182
    type_1_640300/_010200000000/,191
    type_2_410300/_010200000000/,192
    type_2_530400/_010200000000/,211
    type_1_341500/_010200000000/,212
    type_1_522400/_010200000000/,221
    type_1_330800/_010200000000/,222
    type_1_610800/_010200000000/,231
    type_1_350500/_010200000000/,232
    type_1_532600/_010200000000/,201
    type_1_420200/_010200000000/,202
    type_1_610200/_010200000000/,241
    type_2_350700/_010200000000/,242
    type_1_542100/_010200000000/,251
    type_2_610100/_010200000000/,261
    type_1_230200/_010200000000/,271
    type_1_220300/_010200000000/,281
    type_1_330300/_010200000000/,291
    type_1_230900/_010200000000/,301
    type_3_320500/_010200000000/,311
    type_2_321000/_010200000000/,321
    type_1_131000/_010200000000/,331
    type_2_130200/_010200000000/,341
    type_3_210100/_010200000000/,351
    type_1_210200/_010200000000/,361
    type_2_120000/_010200000000/,371
    type_1_370300/_010200000000/,391
    type_1_371200/_010200000000/,381
    type_1_420500/_010200000000/,401
    type_1_371700/_010200000000/,411
    type_1_410500/_010200000000/,421
    type_2_340800/_010200000000/,431
    type_2_360900/_010200000000/,441
    type_1_360400/_010200000000/,451
    type_1_341800/_010200000000/,461
      

  5.   

    源代码在下面 一共分三个文件try1.java是主执行类 cthc.java是写文件类 cthb.java是读文件类try1.javaimport java.util.*;public class try1
    { /**
     * @param args
     */
    public static void main(String[] args)
    {
    // TODO Auto-generated method stub
    Vector ga=new Vector();
    final int cmax=50;
    final int perthread=10;
    for(int i=0;i<cmax;i++)
    {
    Thread t=new Thread(new cthb(i,perthread,ga));
    t.start();
    }

    cthc mc=new cthc(ga);
    mc.WriteStrFile();
    }

    }cthb.java
    import java.io.*;
    import java.util.*;public class cthb implements Runnable
    {
    private String filepath="C:/new_type/_010200000000_total.txt";
    private int thread_count=0;
    private int record_count=0;
    private BufferedReader gfile;
    private Vector tmal=null;

    public cthb(final int tc,final int rc,Vector al)
    {
    try
    {
    gfile = new BufferedReader(new FileReader(filepath));
    } catch (FileNotFoundException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    this.thread_count=tc;
    this.record_count=rc;
    this.tmal=al;
    //this.dbconn=dbc;
    } public void ReadFileMultiLine(int start_col,int end_col)
    {
      try 
      {
      String tempStr="";
      int i=0;
      while(i<start_col&&gfile.readLine()!= null)
      {
      i++;
      }
      while(i<=end_col&&((tempStr=gfile.readLine())!= null))
      {
      this.tmal.add(tempStr+","+i);
      i++;
      }
      } catch (IOException e) 
      {// 错误处理
       System.out.println("读取数据错误.");
      }
       
    }


    public void run()
    {
    for(int i=0;i<this.record_count;i++)
    {
    this.ReadFileMultiLine((i+this.record_count*this.thread_count+1),(i+this.record_count*this.thread_count+1));
    }
    try
    {
    this.gfile.close();
    } catch (IOException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }cthc.java
    import java.io.*;
    import java.util.*;public class cthc 
    {
    private final String filepath="C:/db/_010200000000_total.txt";
    private PrintWriter gfile;
    private Vector tmal=null;


    public cthc(Vector al)
    {
    FileWriter nf;
    try
    {
    nf = new FileWriter(filepath);
    gfile = new PrintWriter(nf);
    } catch (IOException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    this.tmal=al;
    }

    public void WriteStrFile()
    {
    for(int i=0;i<tmal.size();i++)
    {
    gfile.println(tmal.get(i).toString());
    }
    gfile.close();
    }
    }
      

  6.   

    晕 firefox下贴出来代码这么丑
      

  7.   

    你在粘代码的时候设一下是JAVA代码就好了,看一下回复工具栏上有,
    从你的代码看出来,你原先应该是写C或C++的吧cthb 类的run()和ReadFileMultiLine()方法要改一下,因为ReadFileMultiLine()根本没起到应想的作用而且引起了你的这个BUG,我这里给你稍改了一下,能保证正确,但你还是自己改得再优美一些吧,我把ReadFileMultiLine()方法改去掉了,只修改了run()方法 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(); 


    } 因为你在ReadFileMultiLine()里面对i进行计数判断的时候用readline作为计数条件,导致读文件的指针一直往下走,所以就出错了。
      

  8.   

    汗要做多线程读取的话,也不能用行来读啊
    先计算File的字节大小,然后从偏移地址去读另外,如果只是本地IO的话,用多线程好像是没有意义的
    IO读取的时候也没有多余的CPU时间去划给其他线程,用几个都一样
      

  9.   

    楼上两位,只是学习一下使用多线程,没什么好怪的,JUST A DEMO
      

  10.   

    涉及到文件的随机访问。要使用java.io.RandomAccessFile类。
    看待文件的观念要转变,文件的长度是要用Byte来衡量的,不要使用行数来衡量。
    文件的多线程访问,要顺次拆分文件。首先要知道文件的总长度,以及要使用的线程数量。
    其次,确定每个线程访问同一个文件的起始点和结束点,楼主可能是因为这个没有算好,才会出错。
    读取的数据,也要注意存放的位置问题,按照楼主的思路,最好是每个线程一个数据区,然后等每个线程都读取完毕后,由主线程将每个数据区的内容按照前后顺序依次写入同一个文件。如果所有线程都使用同一个数据区,数据的顺序很容易被打乱,因为,多线程是并发处理的。注意:确定RandomAccessFile类的对象,是否是线程安全的,如果不是,要每一个线程分别创建自己的RandomAccessFile对象。多线程读取同一个文件,要比单线程读取一个文件的效率是要高的。虽然,每个线程都使用的是同一个进程所占有的IO,但是,操作系统都会为每个线程分配时间片的,这样,对于同一个文件,就会有多个时间片来处理文件的内容。
      

  11.   

    呵呵 谢谢13楼的朋友 程序可以了 谢谢 17楼的preferme