当前位置:编程学习 > JAVA >>

求大神。Java多线程有时候运行没有完毕就自动停止了。

这个问题困扰我很久了,希望能通过这个平台上的提问得到朋友们的回复。
完整的代码在下面,每次运行的数据大概是1000-10000条数据
我定义了10个list存放数据,然后根据有数据的list个数来定义相对应的线程
程序开始在另外一个类里面调用run方法,有时候执行得很稳定。
执行稳定的情况下控制台的打印消息是:
线程A负责数据XX条
线程B负责数据XX条
线程C负责数据XX条
线程D负责数据XX条
线程E负责数据XX条
线程F负责数据XX条
线程G负责数据XX条
线程H负责数据XX条
线程I负责数据XX条
线程J负责数据XX条
现在运行数据XXXXXX
现在运行数据XXXXXX
现在运行数据XXXXXX
....
执行完毕..........调用runClose方法重复执行

不稳定的情况下就是
线程A负责数据XX条
线程B负责数据XX条
线程C负责数据XX条
线程D负责数据XX条
线程E负责数据XX条
线程F负责数据XX条
线程G负责数据XX条
线程H负责数据XX条
线程I负责数据XX条
线程J负责数据XX条
现在运行数据XXXXXX
现在运行数据XXXXXX
(卡住在这里了,没有任何异常,为了获取错误容易发生异常的代码都没有加try)

访问的方法块我没有加Synchronized因为怕影响效率以及方法是安全的不需要加。


注:请大家帮我分析一下为什么会运行着就会停止,明明有10000条数据运行到 一大半就停止了呢?不会保错。

万分感谢。。。。。只能给100分了,解决问题全给了。谢谢。



package windowMain;

import java.util.ArrayList;
import java.util.List;
import java.util.TimerTask;
import java.util.concurrent.CountDownLatch;
import com.biz.StockBiz;
import com.entity.StockRun;
import com.impl.StockImpl;
import com.orter.CreateLogin4j;
import com.runClass.GetRunInfo;

public class Test extends TimerTask {
//运行方法
public void run() {
dowork();
}

//主方法
    public void dowork(){
     //执行验证
     StockBiz stockBiz=new StockImpl();
     GetRunInfo getRunInfo=new GetRunInfo();
     getRunInfo.opterSQL();
     //获取需要运行的数据
     List<com.entity.StockRun> listSku=stockBiz.getAllRun();
/*******************************************************************************************/
/*
 * 拆分数据,定义10个线程进行分配工作
 */
List<com.entity.StockRun> listName1=new ArrayList<com.entity.StockRun>();
List<com.entity.StockRun> listName2=new ArrayList<com.entity.StockRun>();
List<com.entity.StockRun> listName3=new ArrayList<com.entity.StockRun>();
List<com.entity.StockRun> listName4=new ArrayList<com.entity.StockRun>();
List<com.entity.StockRun> listName5=new ArrayList<com.entity.StockRun>();
List<com.entity.StockRun> listName6=new ArrayList<com.entity.StockRun>();
List<com.entity.StockRun> listName7=new ArrayList<com.entity.StockRun>();
List<com.entity.StockRun> listName8=new ArrayList<com.entity.StockRun>();
List<com.entity.StockRun> listName9=new ArrayList<com.entity.StockRun>();
List<com.entity.StockRun> listName10=new ArrayList<com.entity.StockRun>();
int runTreSize=listSku.size()/10; //得到每个线程应该存放的数据条数
for (int i = 0; i < listSku.size(); i++) {
if(i<=runTreSize){
listName1.add(listSku.get(i));
}else if(i>runTreSize&&i<=runTreSize*2){
listName2.add(listSku.get(i));
}else if(i>runTreSize*2&&i<=runTreSize*3){
listName3.add(listSku.get(i));
}else if(i>runTreSize*3&&i<=runTreSize*4){
listName4.add(listSku.get(i));
}else if(i>runTreSize*4&&i<=runTreSize*5){
listName5.add(listSku.get(i));
}else if(i>runTreSize*5&&i<=runTreSize*6){
listName6.add(listSku.get(i));
}else if(i>runTreSize*6&&i<=runTreSize*7){
listName7.add(listSku.get(i));
}else if(i>runTreSize*7&&i<=runTreSize*8){
listName8.add(listSku.get(i));
}else if(i>runTreSize*8&&i<=runTreSize*9){
listName9.add(listSku.get(i));
}else if(i>runTreSize*9){
listName10.add(listSku.get(i));
}
}
/*
 * 开启线程,计数当前线程的个数
 */
int runThre=0;
if(listName1.size()!=0){
CreateLogin4j.addLogin4j(null,"\r\n【线程A负责"+listName1.size()+"条,");
System.out.println("线程A:"+listName1.size());
runThre=runThre+1;
}
if(listName2.size()!=0){
CreateLogin4j.addLogin4j(null,"线程B负责"+listName2.size()+"条,");
System.out.println("线程B:"+listName2.size());
runThre=runThre+1;
}
if(listName3.size()!=0){
CreateLogin4j.addLogin4j(null,"线程C负责"+listName3.size()+"条,");
System.out.println("线程C:"+listName3.size());
runThre=runThre+1;
}
if(listName4.size()!=0){
CreateLogin4j.addLogin4j(null,"线程D负责"+listName4.size()+"条,");
System.out.println("线程D:"+listName4.size());
runThre=runThre+1;
}
if(listName5.size()!=0){
CreateLogin4j.addLogin4j(null,"线程E负责"+listName5.size()+"条】");
System.out.println("线程E:"+listName5.size());
runThre=runThre+1;
}
if(listName6.size()!=0){
CreateLogin4j.addLogin4j(null,"线程F负责"+listName6.size()+"条】");
System.out.println("线程E:"+listName6.size());
runThre=runThre+1;
}
if(listName7.size()!=0){
CreateLogin4j.addLogin4j(null,"线程G负责"+listName7.size()+"条】");
System.out.println("线程E:"+listName7.size());
runThre=runThre+1;
}
if(listName8.size()!=0){
CreateLogin4j.addLogin4j(null,"线程H负责"+listName8.size()+"条】");
System.out.println("线程E:"+listName8.size());
runThre=runThre+1;
}
if(listName9.size()!=0){
CreateLogin4j.addLogin4j(null,"线程I负责"+listName9.size()+"条】");
System.out.println("线程E:"+listName9.size());
runThre=runThre+1;
}
if(listName10.size()!=0){
CreateLogin4j.addLogin4j(null,"线程J负责"+listName10.size()+"条】");
System.out.println("线程E:"+listName10.size());
runThre=runThre+1;
}
//定义多条线程
     CountDownLatch latch=new CountDownLatch(runThre);
     if(listName1.size()!=0){
     Worker worker1=new Worker(listName1,latch,"线程A");
     worker1.start();
}
if(listName2.size()!=0){
Worker worker2=new Worker(listName2,latch,"线程B");
     worker2.start();
}
if(listName3.size()!=0){
Worker worker3=new Worker(listName3,latch,"线程C");
     worker3.start();
}
if(listName4.size()!=0){
Worker worker4=new Worker(listName4,latch,"线程D");
     worker4.start();
}
if(listName5.size()!=0){
Worker worker5=new Worker(listName5,latch,"线程E");
     worker5.start();
}
if(listName6.size()!=0){
Worker worker6=new Worker(listName6,latch,"线程F");
     worker6.start();
}
if(listName7.size()!=0){
Worker worker7=new Worker(listName7,latch,"线程G");
     worker7.start();
}
if(listName8.size()!=0){
Worker worker8=new Worker(listName8,latch,"线程H");
     worker8.start();
}
if(listName9.size()!=0){
Worker worker9=new Worker(listName9,latch,"线程I");
     worker9.start();
}
if(listName10.size()!=0){
Worker worker10=new Worker(listName10,latch,"线程J");
     worker10.start();
}
     try {
latch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//等待线程运行完毕
System.out.println("执行完毕..........调用runClose方法重复执行");
//执行完毕
runClose();
}
    
    /**
     * 线程方法
     */
    static class Worker extends Thread{
     List<StockRun> skuList;
     CountDownLatch latch;
     public Worker(List<StockRun> skuList,CountDownLatch latch,String threadName){
      this.setName(threadName);
      this.skuList=skuList;
      this.latch=latch;
     }
     //开始运行方法
     public void run(){
     doWork();                     //工作了
     latch.countDown();           //线程完成工作,计数器减一
     }
     //工作方法
     private void doWork(){
     StockBiz biz=new StockImpl();
     for (int i = 0; i < skuList.size(); i++) {
     StockRun stockRun = skuList.get(i);
     //验证数据
     Boolean returnTb=biz.returnRunBreak("1", stockRun.getRWuliaobianma());
     Boolean returnSc=biz.returnRunBreak("4", stockRun.getRWuliaobianma());;
     Boolean returnJd=biz.returnRunBreak("3", stockRun.getRWuliaobianma());;
     Boolean returnDd=biz.returnRunBreak("5", stockRun.getRWuliaobianma());;
     Boolean returnYhd=biz.returnRunBreak("2", stockRun.getRWuliaobianma());;
     Boolean returnQt=biz.returnRunBreak("6", stockRun.getRWuliaobianma());;
     Boolean returnFx=biz.returnRunBreak("7", stockRun.getRWuliaobianma());;
     Boolean returnPp=biz.returnRunBreak("8", stockRun.getRWuliaobianma());;
     //调用主方法
     biz.newKucunFeipei(stockRun.getRWuliaobianma(), stockRun.getRShijian(),
     stockRun.getRTaobaoNum(),stockRun.getRShangchengNum(), stockRun.getRJingdongNum(),
     stockRun.getRDangdangNum(), stockRun.getRYihaodianNum(),stockRun.getRQutianNum(),stockRun.getRFenxiaoNum(), stockRun.getRPaipaiNum(),
     stockRun.getRTaobaoNumId(), stockRun.getRTaobaoSkuId(),
     stockRun.getRShangchengNumId(), stockRun.getRShangchengSkuId(), 
     stockRun.getRJingdongId(),stockRun.getRYihaodianId(),stockRun.getRDangdangId(),
     stockRun.getRWuliaobianma(),stockRun.getRQutianWareId(),stockRun.getRFenxiaoProductId(),
     stockRun.getRFenxiaoProperties(),stockRun.getRPaipaiItemLocalCode(),stockRun.getRPaipaiStockLocalCode(),
     returnTb,returnSc,returnJd,returnDd,returnYhd,returnQt,returnFx,returnPp,null,null,"全量:分配",false);
     System.out.println("现在运行到的数据是:"+stockRun.getRWuliaobianma());
     }
     }
    }
    
    //执行完毕,重复执行
public void runClose(){
for(int i=600;i>=0;i--){
System.out.println(i+"秒后运行...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.dowork();
}
}


--------------------编程问答--------------------
大家顶顶啊。。。
求管理员置顶一下。 --------------------编程问答-------------------- 求大神啊。
求大神啊。
求大神啊。 --------------------编程问答-------------------- 看到你写的第四句话的时候我就来写回复了,你为什么要调用run方法? --------------------编程问答-------------------- 线程本身没什么问题啊 是不是内存的问题 --------------------编程问答--------------------
引用 3 楼 MrsFeng 的回复:
看到你写的第四句话的时候我就来写回复了,你为什么要调用run方法?


方法开头调用run方法的原因是:原来开始做的时候我是用的Java窗体,弄得定时器调用run方法
定时器里面也只是调用一次run方法哦。
--------------------编程问答-------------------- public static void rumTime(){
Timer timer = new Timer(); 
timer.schedule(new Test(), 0);
}
这个是另外一个方法里面调用这个线程方法的Run的,只执行一次。
今天早上来看又停止了。。。
--------------------编程问答-------------------- 没人来啊,,求大神啊 --------------------编程问答-------------------- 没看懂你的程序逻辑,一方面不完整,另一方面也感觉有点诡异。没法给出建议,不好意思。
补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,