二回调
轮询方法最大的特点是主类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();
returnThreadInfostart();
}
public static void receiveStr(String str){
Systemoutprintln(str);
}
}
相比于前面我们在Main类中添加了一个静态方法receiveStr(String str)该方法是供线程结束之前调用通过参数str将要返回的线程信息返回给Main类并输出显示出来下面是修改后的ReturnThreadInfo类该类在线程结束前回调了MainreceiveStr方法通知线程已结束
package threadtest;
/**
*
* @author shi mingxiang
*/
public class ReturnThreadInfo extends Thread {
private String str;
public ReturnThreadInfo() {
thisstr = Hello;
}
public void run(){
thisstr = Hello World!;
MainreceiveStr(str); //回调receiveStr方法
}
}
如果有很多个对象关心线程的返回的信息线程可以保存一个回调对象列表某个对象可以通过已经定义的一个对象将自己添加到列表中表示自己对这些信息的关注如果有多个类的实例关心这些信息也可以定义一个interface在interface中声名回调方法然后这些类都实现这个接口其实这是典型的java处理事件的方法这么做可以使得回调更灵活可以处理涉及更多线程对象和类的情况稍后会给出这种模仿事件处理模型的回调的实现方法
[] [] []