问个高难问题,看有人能解决不(线程)

magictxh123 2004-07-22 11:55:47
有如下四个类:
/*=====主程序Call==========*/

public class Call{
public static void main(String args[]){
new Call();


}
public Call(){
A a=new A();
a.callB();
System.out.println("return message is "+a.getMessage());

}
}


/*=======类A,完成调用耗时操作和显示等待窗口============*/
public class A{
String message;
public A(){

}
public void callB(){
B b=new B(this);
b.start();
C c=new C(b);
c.start();
}
public String getMessage(){
return message;
}
public void setMessage(String message){
this.message=message;
}

}

/*==============类B ,显示等待窗口==================*/

import javax.swing.*;
public class C extends Thread{
JFrame dialog;
B b;
public C(B b){
this.b=b;
init();
}
public void init(){
dialog=new JFrame("提示");
dialog.getContentPane().add(new JLabel("正在执行....."));
dialog.setBounds(400,400,200,50);
dialog.show();
}
public void run(){
try{
b.join();
}
catch(Exception e){
}
dialog.dispose();
}
}

/*=========== 类C,进行耗时操作=============*/


public class B extends Thread{
A a;
public B(A a){
this.a=a;
}
public void run(){

for (int i=0;i<=100000;i++){
for(int j=0;j<=100000;j++){

}

}
a.setMessage("Finished");

}
}


现在运行程序Call,得到的结果是显示了窗口B,但是返回的message确是空值.

可是我想要的结果是让他得到"Finished",因为我还想对这个Finished进行处理。

该如何做?说明,有一种解决方案是把Call做成线程,让这个线程监视耗时类C,等待C完成后在进行处理
可是我不想这样做。因为我有很多和Call一样的程序,那样我要把每一个类似Call的程序都要改动。

我的想法是在A中处理。让A来监视C,等到C完成后在返回Call继续执行,在C执行的同时还要显示B,能做到吗?









...全文
159 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
magictxh123 2004-07-22
  • 打赏
  • 举报
回复
先把这贴借了, shangqiao(伤桥) 和 xu_yun(努力争钱买车) 请到http://community.csdn.net/Expert/topic/3199/3199694.xml?temp=.3472864帮看看这贴。
magictxh123 2004-07-22
  • 打赏
  • 举报
回复
还有,那个按钮的状态一直是按下的,直到我的那个耗时线程执行完成时才恢复,这个改如何解决?
magictxh123 2004-07-22
  • 打赏
  • 举报
回复
试验过了,按照上面两位的方法都可以。可是现在的问题是当我的Call是一个窗口上面有一个按钮时,那么在执行这个程序,显示的等待窗口就是灰色的,是不是和界面的刷新有关系?
820830 2004-07-22
  • 打赏
  • 举报
回复
呵呵,我一看到类名有A,B,C,D之类的字母简写我就晕~
shangqiao 2004-07-22
  • 打赏
  • 举报
回复
package topic.j3199.j3199199;

public class A{
String message;
Call call=null;
public A(Call call){
this.call=call;
}
public void callB(){
System.out.println("callB()");
B b=new B(this);
b.start();
C c=new C(b,call);
c.start();
}
public String getMessage(){
return message;
}
public void setMessage(String message){
this.message=message;
}

}
shangqiao 2004-07-22
  • 打赏
  • 举报
回复
package topic.j3199.j3199199;


public class Call{
public static void main(String args[]){
new Call();
}
public Call(){
A a=new A(this);
synchronized(this){
a.callB();
try {
wait();
System.out.println("call");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

System.out.println("return message is "+a.getMessage());

}
}
shangqiao 2004-07-22
  • 打赏
  • 举报
回复
可以设定一个锁,当Call运行时等待这个锁的唤醒,而这个锁的唤醒则在C中执行完B后,代码如下:
徐蕴 2004-07-22
  • 打赏
  • 举报
回复
public void callB(){
B b=new B(this);
b.start();
C c=new C(b);
c.start();

//加上b.join()或者c.join(),让主线程等待相应的子线程结束
try {
c.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧