线程A中通过方法f创建了线程B,那么如何得到线程B的引用呢?
(方法f对我来说是透明的,也就是f的实现是不能修改的)

解决方案 »

  1.   

    开始以为没有办法。google了一下,结果有办法:Thread.getAllStackTraces()下面是抄来的例子:public Set<Thread> findThreadsRunningClass(Class classToFindRunning) {  Set<Thread> runningThreads = new HashSet<Thread>();
      String className = classToFindRunning.getName();  Map<Thread,StackTraceElement[]> stackTraces = Thread.getAllStackTraces();
      for(Thread t : stackTraces.keySey()) {
        StackTraceElement[] steArray = stackTraces.get(t);
        for(int i = 0;i<steArray.size();i++) {
          StackTraceElement ste = steArray[i];
          if(ste.getClassName().equals(className)) {
            runningThreads.add(t);
            continue;
          }
        }
      }  return runningThreads;
    }
      

  2.   


    大哥,你仔细看看 
    public static Map <Thread,StackTraceElement[]>  Thread.getAllStackTraces(); jvm里的所有线程都在这里,你要的线程也在里面。上面的例子是根据java类名来找线程,不是通过线程名字来找。当然,我觉得上面的例子也未必就完美。我觉得得到一个Theads列表,然后遍历这个列表,
    for(Thread thread : threas)
    {
      if(thread instanceof foo.Bar)
      {
         //do sth
      }
    }
      

  3.   

    上面的话我收回,写线程写得少,出洋相了。那个例子做法是完美的。我只想起继承Thead来开线程,忘了可以实现Runable的方法了。
      

  4.   

    根据java类名来找线程?java类名和线程有对应关系吗?
    下面是代码的一个片段,你看下。
    cfted是一个dialog,cfted.addNotify()产生一个新的线程,也就是产生与GUI绑定的本地操作系统的对象(同位体 peer对象)
    怎么得到cfted.addNotify()产生的新线程?boolean isUpdateSuccess=false;
    boolean isUploadSuccess=false;
    CustomFormTableEditorDialog cfted = new CustomFormTableEditorDialog("","","",ClientUtility.getMainFrame());
    for(int i=0;i<dvfFiles.length;i++){
    isUpdateSuccess=false;
    isUploadSuccess=false;
    String tableFile=this.strTempPath + "\\" + dvfFiles[i].split("#")[0] + ".dvf";
    try{
    CustomFormUtility _cfu = new CustomFormUtility();
            String s = this.strWorkSpacePath + "\\" + dvfFiles[i].split("#")[0] + ".dvf";
            if ( s.equalsIgnoreCase("") )
             return ;
             cfted._strObjName=pobjectNames[i];
            cfted._strFileName=s;
            cfted.setCustomFormUtility(_cfu);
            cfted.setModal(true);
            cfted.addNotify();
    cfted.OpenTableFile(s);
    CustomFormEditorCanvas cfec_1=cfted._f;
            cfec_1.ReplaceTemplateByPosition(templateFile);
            isUpdateSuccess=cfec_1.SaveTableAs(tableFile);
            if(UploadTableToVolume(par, tableFile,dvfFiles[i].split("#")[0] + "_MAINMODEL.dvf",dvfFiles[i].split("#")[0] )==0){
             isUploadSuccess=true;
            }
    }catch(Exception eee){
    eee.printStackTrace();
    }
    }
    if(isUpdateSuccess && isUploadSuccess){
    MessageBox.showInformMessage("更改完毕", par);
    }
    else{
    MessageBox.showInformMessage("更新失败请重试", par);
    }
      

  5.   

    CustomFormTableEditorDialog 这个类实现的代码贴出来看看,有源代码吗?如果没有,debug程序在这里cfted.addNotify(); 设置一个断点,比较一下这一行执行前后,增加的线程的信息,可以得到这个线程的类名是什么
      

  6.   

    设置断点了,但DEBUG的时候根本没发现新的线程
    awt.Component包中该方法的解释:
    addNotify
    public void addNotify()通过将此 Component 连接到一个本机屏幕资源使其成为可显示的。此方法由工具包内部调用,不应直接由程序调用。 从以下版本开始: 
    JDK1.0 
    另请参见:
    isDisplayable(), removeNotify()
    我直接调用该方法也是无奈。因为一旦调用setVisible(true)方法的话程序就阻塞在那了,因为在dispose()之前还要做很多事情。我刚发的那段程序在cfted.OpenTableFile(s); 这句之前sleep下就可以跑通,但是显然sleep方法是不能用在这的
      

  7.   


    晕晕,没有信线程,怎么找啊? 或者在执行这句前,就已经初始化线程了。你现在想办法得到你到底要找什么线程吧。用debug方法,把所有的线程都牵出来溜溜?我google到的那个办法本生是可以用的。把你的40分给我吧,我打字都把手打酸了,呵呵
      

  8.   

    你那个方法我还没有试,关键是java UI这部分本身就很多多线程设计。
    cfted本身就已经初始化了,但是cfted对应的同位体并不是new cfted的时候产生的,
    你可以自己写个程序看下,你new一个dialogDEBUG看下他的peer属性就知道了,是null。
    当你调用本地资源的时候才会new出peer对象,而peer对象的生成肯定由另外一个线程来做,
    现在的问题就是我得不到产生peer对象的线程的引用。
    分会给的,没有功劳也有苦劳啊,别着急。
      

  9.   

    我不会搞java ui,无能为力了。
      

  10.   

    没怎么编过UI方面的代码,不知道楼主要那个线程的引用干什么。
    一般UI编程,控制线程,我们都采用曲线救国的方式,产生个事件什么的,来影响不同线程之间的状态。如果楼上的那个得到所有线程信息的方法成立。
    那么,楼主可以在cfted.addNotify()之前,获取一下所有线程的信息。
    然后,在cfted.addNotify()之后,再获取一下。
    最后,比较一下两次获取信息的不同之处,或许可以找到有用的信息。
      

  11.   


    得到线程的引用就可以调用该线程的join方法,确保该线程也就是cfted.addNotify()创建的同位体对象能在cfted.OpenTableFile(s)这句执行前完成,这样再调用cfted.OpenTableFile(s)就不会有问题了
    目前的问题是,cfted.addNotify()方法和cfted.OpenTableFile(s)是异步的,也就是cfted.OpenTableFile(s)的时候可能cfted的同位体还没有生成,生成的不完整
      

  12.   

    你问题还没有解决啊? 我估计符合你要求的方案,就只有这个了public static Map <Thread,StackTraceElement[]>  Thread.getAllStackTraces()你还是多花点时间研究,你要找的线程的特征吧,比如线程名字,线程使用的类的名字什么的。因为线程都在这Thread.getAllStackTraces(),只是你不知道是哪一个而已。