如何解释 “在无线循环的主线程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();
}
}
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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