如何解释 “在无线循环的主线程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   疯狂的妞妞  阅读(1303)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示