background image

 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
 */