获取java线程中信息的两种方法[3]

2025-02-24 21:25:43
推荐回答(1个)
回答1:

    二 回调

    轮询方法最大的特点是主类Main不断询问线程类是否结束 这实际上大量浪费了运行时间 特别是当线程特别多的时候 因此如果反过来在线程结束时 由线程自己告诉主类Main线程已经结束 然后Main再获取并输出str的值 这样就避免了轮询方法所带来的不必要的系统开销问题

    在具体的实现过程中 线程可以在结束时通过调用主类中的一个方法来实现告知功能 这种方法叫做回调 这样主类Main就可以在等待线程结束时休息 也就不会占用运行线程的时间 下面是修改后的Main类

 public class Main{  public Main() {  }  /**   * @param args the mand 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 threadtest ;/**** @author shi mingxiang*/public class ReturnThreadInfo extends Thread {  private String str;  public ReturnThreadInfo() {    this str = Hello ;  }  public void run(){      this str = Hello World! ;   Main receiveStr(str); //回调receiveStr方法  }}

    如果有很多个对象关心线程的返回的信息 线程可以保存一个回调对象列表 某个对象可以通过已经定义的一个对象将自己添加到列表中 表示自己对这些信息的关注 如果有多个类的实例关心这些信息 也可以定义一个interface 在interface中声名回调方法 然后这些类都实现这个接口 其实这是典型的java处理事件的方法 这么做可以使得回调更灵活 可以处理涉及更多线程 对象和类的情况 稍后会给出这种模仿事件处理模型的回调的实现方法

lishixinzhi/Article/program/Java/gj/201311/27712