public void Task implements Runnable {  public static int postion = 0;  public static int queryNum = 1000;  private int start;  private int end;  public static void run() {
    for (int i=start, i <end; i++) {
        System.out.println("处理中");        每次查询之后都把 postion 指针 加上 queryNum 个
        这个修改postion指针 一定要线程同步 
    }
  }
}

解决方案 »

  1.   

    对2楼的方法做个补充,
    你需要记录的就是最后一个取数据的线程取到多少条数据了,所以要有一个static字段来标示
    比如
    static int pos;而为了数据同步的安全(虽然我认为在你的这个程序里几乎不会发生这种冲突,几率太低),但是建议你在取pos的时候用这么一个方法static int getCurrentPos()
    {
            synchronized(pos)
            {
                    pos += 1000;
                    return pos;
            }
    }
      

  2.   

    你只开三个Thread不就可以了吗
      

  3.   

    你这问题的关键在于要做一个线程串,避免jvm自己调度导致数据处理的不对。
    1.实现一个构造线程串的方法,这个方法返回最先要调用的线程(FillData 是线程类):private FillData buildThread() {
            List<FillData> list = new ArrayList<FillData>();
            //构造你要的3个线程
      for(int i=0;i<3;i++){
             list.add(new FillData());
             }
            //实现线程串连
            for (int i=0;i<list.size()-1;i++){
                list.get(i).setAfter(list.get(i+1));
            }
            return list.get(0);
    }2.线程类特殊的地方:class FillData extends Thread {
            private FillData after;
            public void setAfter(FillData after) {
                this.after = after;
            }
            public void run() {
                 //...处理数据
                
                if (null != after) {
                    try {
                        sleep(1000);
                    } catch (InterruptedException e) {
                        log.error("filldata sleep error",e);
                    }
                    after.start();
                    return;
                }
            }
    }
    3.调用的地方 buildThread().start();即可
      

  4.   

    另外,不知道你说的10w数据加载在内存为什么用溢出。如果是服务器的话问题不大,我这边的程序需要加载大约5000w db记录在内存,也就占用6-7G
      

  5.   

    new三个线程,线程处理完1000条再去取下一个1000条,直到没有数据为止。