小弟线程刚入门 想做个demo 多线程读文件 然后写出来
文件有500行 我想分5个线程读 每个线程 我在主文件里面设置一个Vector 然后构造读文件类的时候把Vector传进去
构造线程时候使用for循环把i传进去 确定改线程读取的行数例如 i=0 则是读1-100行 以此类推
然后在主程序里执行一个操作 把Vector里面的内容写进另外一个文件
但是为什么我每次都是100-200行 都不到500行
而且线程数越多得到行数也多请高手指点下啊
文件有500行 我想分5个线程读 每个线程 我在主文件里面设置一个Vector 然后构造读文件类的时候把Vector传进去
构造线程时候使用for循环把i传进去 确定改线程读取的行数例如 i=0 则是读1-100行 以此类推
然后在主程序里执行一个操作 把Vector里面的内容写进另外一个文件
但是为什么我每次都是100-200行 都不到500行
而且线程数越多得到行数也多请高手指点下啊
解决方案 »
- 外观问题
- String 的构造方法String(String original)
- ###【荣誉榜】根据网友推荐,以及M_song 的一贯表现,决定奖励100专家分。请回复收取
- 一个简单的线程通讯的问题,麻烦看一下!
- 请问个socket简单问题
- 关于文件锁
- 请教
- ★ 简单问题 ★
- 用new JTalbe(10, 20)创建了一个table,如何设置该table列(column)的宽度
- 请问java.awt.GridBagConstraints 中的insets(0,0,0,0)的参数具体指的是什么?
- 【竞答】String.getBytes("Unicode")中,额外2个字节的来源
- 为什么Java编译时返回"cannot resolve symbol symbol : method doubleValue location : class java.lang.Double"的错误?
不同线程从不同的行开始读 例如文件总共有500行 那我就分5个线程 第一个线程都1-100行 第二个读101-200行 直到第五个读401-500行
我把这些读出来的数据都以String保存到Vector中去 然后再输出到目标文件里面 现在问题是我执行之后目标文件行数远小于500行(大概20多行) 而且你如果刚开始线程分的越多(例如我不是分5个 分成10个 20个 30个)行数就会越多 但是还是小于500(100+行)这个是为什么啊?
多线程读文件,DAO的读取方法应该同步
所以你要加对象锁!再者你也不能控制永远是第一个,第二个线程,。。依次同时的运行,如果第二个线程
比第一个提早了,Vector中数据顺序就出错了!
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
{ /**
* @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();
}
}
从你的代码看出来,你原先应该是写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作为计数条件,导致读文件的指针一直往下走,所以就出错了。
先计算File的字节大小,然后从偏移地址去读另外,如果只是本地IO的话,用多线程好像是没有意义的
IO读取的时候也没有多余的CPU时间去划给其他线程,用几个都一样
看待文件的观念要转变,文件的长度是要用Byte来衡量的,不要使用行数来衡量。
文件的多线程访问,要顺次拆分文件。首先要知道文件的总长度,以及要使用的线程数量。
其次,确定每个线程访问同一个文件的起始点和结束点,楼主可能是因为这个没有算好,才会出错。
读取的数据,也要注意存放的位置问题,按照楼主的思路,最好是每个线程一个数据区,然后等每个线程都读取完毕后,由主线程将每个数据区的内容按照前后顺序依次写入同一个文件。如果所有线程都使用同一个数据区,数据的顺序很容易被打乱,因为,多线程是并发处理的。注意:确定RandomAccessFile类的对象,是否是线程安全的,如果不是,要每一个线程分别创建自己的RandomAccessFile对象。多线程读取同一个文件,要比单线程读取一个文件的效率是要高的。虽然,每个线程都使用的是同一个进程所占有的IO,但是,操作系统都会为每个线程分配时间片的,这样,对于同一个文件,就会有多个时间片来处理文件的内容。