关于JAVA中线程嵌套线程的题目? [复制链接]  
  凌忆落雪 发短消息 
加为好友 
凌忆落雪 当前离线 
最后登录2010-7-1 注册时间2009-12-21 阅读权限10 积分79 精华0 帖子99  
新手上路新手上路, 积分 79, 距离下一级还需 121 积分 
注册时间2009-12-21 威望0  体力0  硬币0  积分79 帖子99  1# 
 发表于 2010-7-5 09:40 |只看该作者 |倒序浏览 |打印 我从页面拿到两个数组,然后把这两个数组传入多线程中,程两个数组轮回嵌套,里面的轮回,每轮回一次产生新的线程。外层每轮回一次都必需等待里面的轮回线程执行完闭后才能下一轮回。这样。 
需求:
我从页面拿到两个数组,然后把这两个数组传入多线程中,程两个数组轮回嵌套,里面的轮回,每轮回一次产生新的线程。外层每轮回一次都必需等待里面的轮回线程执行完闭后才能下一轮回。这样。
  对于要检查别人心灵,柏拉图他具备三样东西:知识、仁慈、胆量。 —— 蒙田 我的状况:
无法判断里面的轮回线程是否都执行完闭,写出来之后仍是一直运行。
我的思路是里面的轮回每产生我会定义好名称,然后放在数组中,在第轮回中判断数组中的线程是否死亡。好像我写的代码控制好。一直在运行。
还请高手帮帮小弟
注:上文有可能描述的很明白还请见谅。
谢谢!代码如下:
Java codepublic class TestThread {    /**     * @param args     */    public static void main(String[] args) {        //首先定义两个数组        String [] arrTimes = {"2010-01-01","2010-02-01","2010-03-01","2010-04-01"};        String [] arrFiles = {"file1 A","file2 B","file3 C","file3 D"};        Thread t =  new Thread(new ThreadRunJob(arrTimes,arrFiles));        t.start();    }}public class ThreadRunJob implements Runnable{        private String [] arrTime;    private String[] arrFiles;        public ThreadRunJob() {    }        public ThreadRunJob(String [] arrTime,String[] arrFiles) {        this.arrFiles = arrFiles;        this.arrTime  = arrTime;    }        public void run() {        int timeLen = arrTime.length;        int fileLen = arrFiles.length;        String [] threadNames = new String[fileLen];        if(timeLen>0){            for(int i=0;i<timeLen;i++){                System.out.println("先把给插入到数据库中:"+arrTime);                if(fileLen>0){                    for(int j=0;j<fileLen;j++){                        String [] arrTemp = arrFiles[j].split("");                        threadNames[j]=arrTemp[1];     //线程名称                        Thread thread = new Thread(new RunJob(arrTemp),arrTemp[1]);                        thread.start();                    }                }                //此方法是获得当前的线程.注:代码是在网上找的。呵呵..                Thread[] threads = JobUtil.findAllThreads();                //此方法是把当前的线程与刚刚运行的线程名传入,然后返回线程中还没运行完闭的线程..                Thread[] currentThreads = JobUtil.currentMainThread(threads,threadNames);                                //下面是把中存活的线程轮回,每休止线程就减减一直到全部运行完成。                int len = currentThreads.length;                int diff = len;                while(diff!=0){                    for(int j=0;j<len;j++){                        Thread t = currentThreads[j];                        System.out.println("22"+t.getName()+"+isAlive:"+t.isAlive()+"+isInterrupted:"+t.isInterrupted());                        //判断是此线程是否流动..                        if(!t.isAlive()){                            System.out.println("diff:"+diff);                            diff--;                            System.out.println("11"+t.getName()+"+isAlive:"+t.isAlive()+"+isInterrupted:"+t.isInterrupted());                        }                    }                }            }        }            }}public class RunJob implements Runnable{        String [] jobfile = null;        RunJob(String[] jobfile){        this.jobfile = jobfile;    }        public void run() {        System.out.println(jobfile[0]+"-----------");    }} 
 

解决方案 »

  1.   

    JAVA多线程嵌套问题,A里开B,若把A关闭,B呢?
     悬赏分:45 - 解决时间:2008-12-27 12:02 
    public class A extends Thread{
     public void run(){
      B b = new B();
      b.start();
      b.join();
     }

    问题补充:还有个问题想问,就是知道了线程的ID怎么得到对应的线程对象??回答后上分提问者: wscooll - 四级最佳答案b仍然运行。 像这种问题,学习最好的办法是自己做一个简单实验, 这样可以大大提高你的代码水平,我就是这样过来的, 希望楼主进步. java其实很容易 
    public class AWTest { 
    boolean f=true; 
    public AWTest(){ 
    frame=new Frame("测试程序 按ESC键退出"); 
    frame.setSize(width, height); 
    frame.setBackground(Color.GRAY); 
    canvas=new TheCanvas(width,height,this); 
    frame.add(canvas); 
    frame.pack(); 
    frame.setVisible(true); f=true; 
    Thread t1=new Thread( 
    new Runnable(){ 
    public void run() { 
    new Thread( 
    new Runnable(){ public void run() { while(true){ System.out.println("我是第二个线程,我一直在运行"); } } }).start(); 
    while(f){ System.out.println("我是第一个线程我,一直在运行"); 

    }} 
    ); t1.start(); 
    try { 
    Thread.sleep(3000); 
    f=false;//关闭t1 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 

    } public static void main(String[] args) { 
    new AWTest(); 
    } }
    另外,楼的想问什么id,我估计你是上次问怎么管理很多线程的那个人吧
    这样:
    你要用个hashtable来存所有线程地象
    每生成一个线程就把它可存到哈希表中。哈希表需要一个id做主键,
    你知道id的话就能从表中把线程实例找回来,把线程的停止标志位改变就行了设Runnable对象中有标志位flag=true;
    并且run函数写成
    while(flag){//永不停止
    //.....
    }每次生成一个线程实例就加到hashtable中
    Hashtable table=new Hashtable();
    .....//生成1000个线程,并启动
    for(int i=0;i<1000;i++){
    MyRunnable r1=new MyRunnable (); 
    r1.flag=true;
    table.put(""+i, r1);//加入到哈希表,数字字符串做索引主键 key(id)
    new Thread(r1).start();
    }//现在,如果你想停止某个线程,假设你要停第999个
    MyRunnable r=(MyRunnable )table.get("999");
    r.flag=false;// r线程的死循环可以退出了,从而结束该线程 
      

  2.   

    synchronized关键字可以实现两个线程同步一个主线程的变量Object syncObj = new Object(),在第一线程的同步块中syncObj.wait(),syncObj.notifyAll()以后第二个线程才能进入同步块中,然后使用同样的方法回到第一线程的同步块中。建议楼主好好看看java的线程同步、sychronized方面的内容