if(!str.equals("Hello")){
System.out.println(returnThreadInfo.getThreadInfo());
break;
}
}
}
}
这种方案虽然能起到作用,但是它做了大量不需要做的工作。事实上,还有一种更简单
有效的方法来解决这个问题。
二、回调
轮询方法最大的特点是主类 Main 不断询问线程类是否结束,这实际上大量浪费了运
行时间,特别是当线程特别多的时候。因此如果反过来在线程结束时,由线程自己告诉主
类 Main 线程已经结束,然后 Main 再获取并输出 str 的值,这样就避免了轮询方法所带
来的不必要的系统开销问题。
在具体的实现过程中,线程可以在结束时通过调用主类中的一个方法来实现告知功能 ,
这种方法叫做回调。这样主类 Main 就可以在等待线程结束时休息,也就不会占用运行线
程的时间。下面是修改后的 Main 类:
public class Main{
public Main() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
ReturnThreadInfo returnThreadInfo = new ReturnThreadInfo();
returnThreadInfo.start();
}
public static void receiveStr(String str){
System.out.println(str);
}
}
相比于前面,我们在 Main 类中添加了一个静态方法 receiveStr(String str),该方法
是供线程结束之前调用,通过参数 str 将要返回的线程信息返回给 Main 类并输出显示出
来。下面是修改后的 ReturnThreadInfo 类,该类在线程结束前回调了 Main.receiveStr
方法,通知线程已结束。
package threadtest1;
/**
*
* @author shi mingxiang
*/