You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java线程疑问:死循环线程中的对象为何可被其他线程调用方法?

问题解答

你的核心误解在于混淆了线程的执行状态和对象的存储与访问权限,下面拆解说明:

1. 对象的存储位置决定了可访问性

你代码里的whatTime wt是在主线程的main方法中创建的,它指向的对象实例存储在JVM的堆内存中——堆内存是所有线程共享的区域,不属于某个线程私有。只要其他线程持有这个对象的引用(比如threadA通过构造函数拿到了wt的引用),不管创建它的线程是什么状态,都能调用该对象的方法。

这里要注意:如果对象是线程栈里的局部变量(比如在死循环内部声明的基本类型变量),其他线程确实访问不到,但你代码里的wt是指向堆中对象的引用,且已经传递给了threadA,所以threadA完全能正常使用。

2. 线程是独立的执行流

调用threadA.start()后,threadA就成为了一个独立的执行线程,和主线程是并行(或通过操作系统调度切换执行)的关系。主线程进入while(true)死循环,只是主线程自己一直在执行空循环,不会阻止其他线程的运行(即使是单CPU,操作系统也会通过时间片轮转调度不同线程)。

你代码里threadA的run方法里有Thread.sleep(10000),每10秒线程会被唤醒,执行wt.getTime()——这个方法只是获取系统当前时间,和主线程的状态没有任何关联,只要wt的引用有效,就能正常调用。

代码逻辑再梳理

你的代码执行流程是:

  1. 主线程创建whatTime对象wt(存于堆内存)
  2. 主线程创建threadA实例,把wt的引用传给它
  3. 主线程启动threadA,threadA进入独立执行状态
  4. 主线程进入空死循环,但threadA已经持有wt的引用,不受主线程影响,每10秒调用一次wt.getTime()输出时间

纠正你的错误认知

“处于死循环的线程无法被交互,因此其内部声明的对象也不应被访问”这个说法不准确:

  • 线程死循环只是它自身的执行状态,不影响其他线程访问共享堆内存中的对象
  • 只有当对象是线程私有栈中的局部变量时,其他线程才无法访问,而堆中的对象只要有引用就能访问

内容的提问来源于stack exchange,提问作者user18715126

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:55:12