如何解释 “在无线循环的主线程new一个对象”

最后我还是转行做后台了,博客也搬家去博客园了,ID 还是疯狂的妞妞,主要原因是 CSDN 之前有段时间特别卡,想回去看自己的文章实在麻烦。
之前研究 Handler 机制是在一年前,很多内容COPY了其它博主的,也有一些是小伙伴整理的,
最近在研究阻塞队列,想起了Handler,它的机制实在巧妙,准备用阻塞队列实现一个我们自己的 Handler。

说明

这个过程中,我想到一个问题:
就像下面这个代码,我们的主线程,会启动一个死循环,可是我们常常说 “在主线程中,new 了一个对象”,都死循环了还怎么 new?

class Example{
    public static void main(String[] args) {
        while(true){
            // run
        }
        // 如果把代码写在这,只会在结束应用的时候执行
        new Object();
    }
}

答案也很简单,首先你 new 的这个操作,其实是在 while 循环体内部,这就解释了:为什么能在无线循环的主函数中 new 对象。

class Example{
    public static void main(String[] args) {
        while(true){
            // 程序执行过程中,会产生无数的子线程
            new Thread(() ->{
                // new 的操作,实际上是在这个位置
                new Object();
            }).start();
        }
    }
}

按照上面的代码,new 出来的对象,明显属于子线程,怎么解释,在主线程中 new 对象呢?
说的细致点,就像下面这个伪代码,安卓的主线程,就是一个消息轮询线程(Looper线程),子线程只要有 Handler 的引用,就可以不断地推送消息了。
不理解的话,将 Handler 理解成 “订阅者”,子线程是 “发布者”,子程序将消息发送出去,主线程收到消息,就会开始进一步操作了。


public class LooperThread extends Thread {
    @Override
    public void run() {
        // 将当前线程初始化为Looper线程
        Looper.prepare();

        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                // do sth. on main thread!
            }
        };

        new Thread(() -> {
            // 子线程通过 handler 将消息发回到主线程
            handler.sendMessage(new Message());
        }).start();


        // 开始循环处理消息队列
        Looper.loop();
    }
}

posted on 2017-09-15 23:47  疯狂的妞妞  阅读(1296)  评论(0编辑  收藏  举报

导航