1。有一个List由classA组成.每个classA的内容用于生成一个txt文件!
由于List里面有100多w个classA所以想用多线程做!不知道下面的写法是否有问题啊?
而且我经过用下面的例子测试发现noThread这个方法。反而结果速度要比用Thread的速度要快!
不知道是为什么!2。其中for (int i = 0; i < 300000; i++)这部分写50W Java就报溢出了
不知道大家对这种100W数据怎么处理好啊?拆分成数个1W的?3。不知道用多线程怎么记录总执行次数import java.io.File;
import java.util.*;
import org.apache.commons.io.FileUtils;
public class AutoCreateTxt {
// 休息时间
private final static int sleepT = 1000;
// 循环间隔
private final static int dataT = 1000; public static void main(String[] args) {
long start = System.currentTimeMillis();
System.out.println("Start=T=" +start);
List<TxtFileStruct> _list = new ArrayList();
for (int i = 0; i < 300000; i++)
_list.add(new TxtFileStruct("titie=" + i, " content=" + i));
System.out.println("Start==" + _list.size());

//经过测试用非多线程的方法  System.out.println("End==" + ( end-start));
        //的结果反而快                         
new AutoCreateTxt().noThread(_list);

//经过测试用多线程的方法
//用createFilesThread.run方法里面最后一个System.out.println("end==" + end);的数值
        //减去System.out.println("Start=T=" +start);的数值反而比不用多线程的速度慢5倍左右
        //不知道为什么?
//new AutoCreateTxt().runThread(_list);

long end = System.currentTimeMillis();
System.out.println("End==" + ( end-start));
} public void noThread(List<TxtFileStruct> _list) {
int sumData = _list.size();
for (int i = 0; i < sumData; i++) {
createFiles.creTxt(_list.get(i));
} } public void runThread(List<TxtFileStruct> _list) {
int sumData = _list.size();
for (int i = 0; i < sumData; i++) {
// 如果i等于循环间隔,则线程停止X豪秒
if (((i + 1) * dataT) == i) {
try {
Thread.sleep(sleepT);
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
// 这样写会不会开了太多的线程了!?创建和销毁的时间浪费太大了!而且我不知道怎么纪录执行的次数!
// 怎么能用JDK1.5新特性写呢?
new Thread(new createFilesThread(_list.get(i))).start();
}
}
}class createFilesThread implements Runnable {
public TxtFileStruct _as; public static int runSum = 0; public createFilesThread(TxtFileStruct _as) {
this._as = _as;
} public void run() {
createFiles.creTxt(this._as);
runSum++;
//纪录总执行的次数!
// System.out.println("runSum==" + runSum);
long end = System.currentTimeMillis();
System.out.println("end==" + end);
}
}class createFiles {
public static boolean creTxt(TxtFileStruct _as) {
boolean reValue = true;
try {
String strContent = _as.getTitle() + _as.getContent();
 FileUtils.forceMkdir(new File("path"));
 FileUtils
 .writeStringToFile(new File("fname"), strContent, "GBK");
} catch (Exception e) {
e.printStackTrace();
reValue = false;
}
return reValue;
}
}class TxtFileStruct {
private String title; private String content; TxtFileStruct(String _title, String _content) {
this.title = _title;
this.content = _content; } public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
}
}

解决方案 »

  1.   

    1,开了太多的线程了(最多300000,实际不会同时打开)。不仅创建和销毁的时间浪费大了,更严重的是IO竞争。这个应该是方法noThread更快的主要原因.2,[code]
              // 如果i等于循环间隔,则线程停止X豪秒
                if (((i + 1) * dataT) == i) {
      [code]
    貌似不会成立。线程500已经很高了,如果是1W的线程数的话太多了。3。存取runSum要同步。
      

  2.   

    启动线程应该用start()方法。
      

  3.   

    1. 线程的创建和调度也要占用计算资源,所以利用多线程优化性能也有一个平衡点,越过了平衡点效率反而会降低。
    2&3. 连同 http://topic.csdn.net/u/20080615/07/9b880a22-897a-483d-9bdc-7a7dd6f25f37.html 一起回答你,查询数据库数据时对结果分页处理,即每次只取100W条数据中的一部分,多批次处理,这样即不会出现内存溢出又可减轻DB服务器的负担,否则Java程序受得了恐怕DB服务器也得累死。
      

  4.   

    ((i + 1) * dataT) == i
    不知道有何用意,会成立嘛?