二 回调
轮询方法最大的特点是主类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