线程A中通过方法f创建了线程B,那么如何得到线程B的引用呢?
(方法f对我来说是透明的,也就是f的实现是不能修改的)
(方法f对我来说是透明的,也就是f的实现是不能修改的)
解决方案 »
- UDP传输问题
- JDK 从1.6.0_13 升级到1.6.0_31后Java 程序菜单显示的变化, 求解
- getRealpath()方法求解
- 为什么编译不了?提示找不到bao包.
- 打包之后为何资源不可用?
- 想實現一個JAVA小程序的源代碼
- 关于XP中 JBuilder 2006 连接数据库问题??
- 求大家帮我看看java连接db2数据库的问题,似乎很简单,但就是连接不上,
- 新手请教javac编译完后,如何用java命令运行有包的类
- 请问怎样搭建Java得运行平台??
- 这段关于多态性的代码怎么理解?
- "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
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;
}
大哥,你仔细看看
public static Map <Thread,StackTraceElement[]> Thread.getAllStackTraces(); jvm里的所有线程都在这里,你要的线程也在里面。上面的例子是根据java类名来找线程,不是通过线程名字来找。当然,我觉得上面的例子也未必就完美。我觉得得到一个Theads列表,然后遍历这个列表,
for(Thread thread : threas)
{
if(thread instanceof foo.Bar)
{
//do sth
}
}
下面是代码的一个片段,你看下。
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);
}
awt.Component包中该方法的解释:
addNotify
public void addNotify()通过将此 Component 连接到一个本机屏幕资源使其成为可显示的。此方法由工具包内部调用,不应直接由程序调用。 从以下版本开始:
JDK1.0
另请参见:
isDisplayable(), removeNotify()
我直接调用该方法也是无奈。因为一旦调用setVisible(true)方法的话程序就阻塞在那了,因为在dispose()之前还要做很多事情。我刚发的那段程序在cfted.OpenTableFile(s); 这句之前sleep下就可以跑通,但是显然sleep方法是不能用在这的
晕晕,没有信线程,怎么找啊? 或者在执行这句前,就已经初始化线程了。你现在想办法得到你到底要找什么线程吧。用debug方法,把所有的线程都牵出来溜溜?我google到的那个办法本生是可以用的。把你的40分给我吧,我打字都把手打酸了,呵呵
cfted本身就已经初始化了,但是cfted对应的同位体并不是new cfted的时候产生的,
你可以自己写个程序看下,你new一个dialogDEBUG看下他的peer属性就知道了,是null。
当你调用本地资源的时候才会new出peer对象,而peer对象的生成肯定由另外一个线程来做,
现在的问题就是我得不到产生peer对象的线程的引用。
分会给的,没有功劳也有苦劳啊,别着急。
一般UI编程,控制线程,我们都采用曲线救国的方式,产生个事件什么的,来影响不同线程之间的状态。如果楼上的那个得到所有线程信息的方法成立。
那么,楼主可以在cfted.addNotify()之前,获取一下所有线程的信息。
然后,在cfted.addNotify()之后,再获取一下。
最后,比较一下两次获取信息的不同之处,或许可以找到有用的信息。
得到线程的引用就可以调用该线程的join方法,确保该线程也就是cfted.addNotify()创建的同位体对象能在cfted.OpenTableFile(s)这句执行前完成,这样再调用cfted.OpenTableFile(s)就不会有问题了
目前的问题是,cfted.addNotify()方法和cfted.OpenTableFile(s)是异步的,也就是cfted.OpenTableFile(s)的时候可能cfted的同位体还没有生成,生成的不完整