恳求大神帮小弟解决一个有关问题~

恳求大神帮小弟解决一个问题~~
小弟刚接触java不久,看不懂这个程序,烦请大神帮我注释一下,非常感谢!!!恳求大神帮小弟解决一个有关问题~


class Message{
Object obj;
}
class MessageQueue{
LinkedList<Message> list=
    new LinkedList<Message>();
}
class Looper{
MessageQueue mq;
private Handler handler;
public void setHander(Handler handler) {
this.handler = handler;
}
public Looper(){
mq=new MessageQueue();
}
public void loop(){
for(;;){
if(mq.list.isEmpty()){
try{Thread.sleep(3000);}catch(Exception e){}
continue;
}
Message msg=mq.list.removeFirst();
handler.handleMessage(msg);
}
}
}

class Handler{
private Looper looper;
public Handler(Looper looper){
this.looper=looper;
looper.setHander(this);
}
public void sendMessage(Message msg){
this.looper.mq.list.add(msg);
}
public void handleMessage(Message msg){
System.out.println(msg.obj);
}
}

public class Test {

public static void main(String[] args) {
Message msg=new Message();
msg.obj="hello";
Looper looper=new Looper();
Handler h=new Handler(looper){
public void handleMessage(Message msg) {
System.out.println(((String)msg.obj).toUpperCase());
};
};
h.sendMessage(msg);
looper.loop();
}
}

------解决思路----------------------
这个是消息异步处理的一个实现原型。
首先对于组合关系class A,B
class A{
   B b ;
}
外围A访问内部B直接访问即可,因为A组合了b,直接持有其引用
而内部的b需要访问外围的A的时候,是需要持有A的对象的引用才能够使用A对象的方法
这先解释了为什么looper要持有一个handler引用。

//消息,包装任何消息对象
class Message{
Object obj;
}

//消息队列,保存各类发送过来的消息
class MessageQueue{
LinkedList<Message> list=
    new LinkedList<Message>();
}

//looper是个钩子,想象成回形针,解释如最开始部分
class Looper{
//维持一个消息队列以及持有对handler的引用
MessageQueue mq;
private Handler handler;
public void setHander(Handler handler) {
this.handler = handler;
}

public Looper(){
mq=new MessageQueue();
}

//looper自查消息队列,如果不为空,将调用外围handler的方法处理消息
//意思是它自己并不处理消息,只是检查有没有消息并通知别人去处理
//处理方式采取先进先出依次处理的方式
public void loop(){
for(;;){
if(mq.list.isEmpty()){
try{Thread.sleep(3000);}catch(Exception e){}
continue;
}
Message msg=mq.list.removeFirst();
handler.handleMessage(msg);
}
}
}

//处理消息的句柄,这个句柄自带一个钩子,在个钩子回过来还持有这个句柄的引用
//翻译成句柄不知道合不合适,反正只要谁给它发送消息它都会先存起来再处理
//这个消息不一定是自己发给自己的,比如一个独立的线程,很耗时的任务,处理完了将消息发送给它处理
class Handler{
private Looper looper;
public Handler(Looper looper){
this.looper=looper;
looper.setHander(this);
}
public void sendMessage(Message msg){
this.looper.mq.list.add(msg);
}
public void handleMessage(Message msg){
System.out.println(msg.obj);
}
}

public class Test {

public static void main(String[] args) {
//模拟一个消息
Message msg=new Message();
msg.obj="hello";
//钩子实例,并绑定到handler匿名子类对象的实例上
//该匿名子类只是重写了handleMessage(Message msg)方法而已
Looper looper=new Looper();
Handler h=new Handler(looper){
public void handleMessage(Message msg) {
System.out.println(((String)msg.obj).toUpperCase());
};
};
//将消息发送出去,只要任何一个任务持有h,就可以向它发送消息
//这里模拟的是直接发送消息;可以发送很多消息,反正有消息队列可以存储
h.sendMessage(msg);
//好了,looper开始自查消息队列,并依次处理消息了
looper.loop();
}
}

//handler是运行在主线程的,消息可以是其他耗时线程在未知时间运行完后发送的结果
//这样就可以在不阻塞主线程的情况下运行并处理耗时操作结果了
//比如你下载一个图片在ImageView中显示
//如果耗时的下载放在主线程,那么该程序在下载这就卡主了(没法响应其它动作啊),给用户的体验很差
//我只需要另起一个线程处理下载图片任务,当它下载处理完了把图片以消息的形式发出去就可以了
//主线程(通常为UI线程)依旧响应用户的其它各种动作