关于java中线程的几个问题
线程类:关于java中线程的几个问题,java,multithreading,Java,Multithreading,线程类: class NewThread extends thread{ public void abc(){ } } 然后在另一个线程的方法中执行这些代码 public void buttonClicked(){ NewThread thread = new NewThread(); thread.start(); thread.abc(); } 好的,那么对象线程的生命周期取决于方法按钮点击的,因此如果方法返回,对象线程将被销毁,即使线程.start(
class NewThread extends thread{
public void abc(){
}
}
然后在另一个线程的方法中执行这些代码
public void buttonClicked(){
NewThread thread = new NewThread();
thread.start();
thread.abc();
}
线程的生命周期取决于方法按钮点击的,因此如果方法返回,对象线程将被销毁,即使线程.start()
仍在运行
buttonClicked()
。所以我点击按钮几次,每次点击它,就会创建一个新的对象thread
,在这种情况下,JVM中存在许多不同的“NewThread”对象?我就是这么做的,然后JVM崩溃了,在我的PC上,我的java程序似乎失去了应答,我必须使用任务管理器来杀死java.exe,但有时还可以,奇怪thread.abc()之前的buttonClicked()方法中
如果thread.start()
已经完成,我仍然可以调用thread对象thread.abc()代码>
线程在退出方法后不会被销毁。对线程的引用保存在“线程表”中,该表可以通过静态链接访问(所以线程不会被垃圾收集) 好的,那么对象“线程”的生命周期取决于所单击的方法
按钮
,因此如果该方法返回,即使thread.start()
仍在运行,对象线程也将被销毁
我在这里看到两个误解:
- 如果方法
返回,则对对象的引用将消失。按钮单击
的对象实例将一直处于活动状态,直到没有人引用它,并且垃圾收集器决定回收该内存。这意味着,只要NewThread
的NewThread
方法正在运行,run()
的实例就会存在,因为NewThread
实例描述的线程堆栈引用该实例。当NewThread
终止时,该堆栈将被清除run()
将立即返回。它只向第二个线程发出开始工作的信号thread.start()
NewThread
的run()
方法比较慢,那么您正在积累NewThread
实例
我确实喜欢这样,然后JVM崩溃
你是说你喜欢点击按钮和下面的JVM崩溃?;-)
编辑:问题更改/扩展后,出现第三点:
在调用thread.abc()之前的buttonClicked()方法中
如果thread.start()
已经完成,我仍然可以调用thread对象thread.abc()代码>
当然,只要有引用,就可以调用对象上的任何方法<代码>线程
在这里也不例外
我认为您遇到的主要困难是:引用线程指向一个对象。这个对象不是真正的线程(注意小t),它只是一些小的内存区域,有一些关于真正线程的描述。真正的线程由一些CPU设置、OS调度程序、堆栈等组成
对象和实际线程这两个对象的生命周期不是严格耦合的:对象线程
在创建实际线程之前就存在(发生在线程.start()中
)。真正的线程在离开run()
方法后死亡。但是对象线程
即使在这之后仍然存在,直到正常垃圾收集开始时(如前所述)。一个线程也被称为垃圾根,垃圾收集器不会清理它。GC通过使用垃圾收集器根集作为参考点来决定对象是否可访问。这也是垃圾收集器不能收集主线程的原因
当不再有强引用时,对象进入无法访问状态
让它存在。当一个对象不可访问时,它是一个候选对象
收集注意措辞:仅仅因为对象是候选对象
因为收集并不意味着它将立即被收集。JVM
可自由延迟收款,直到立即需要
对象正在消耗的内存。重要的是要注意这一点
任何强引用都会在内存中保存一个对象。这些一定是
从垃圾收集根目录引用该链。GC根是一个
一类特殊的变量,包括
堆栈上的临时变量(任何线程的)静态变量
(来自任何类)来自JNI本机代码的特殊引用
摘自:我认为thread对象没有被破坏,您只是不能在代码中引用它,但它确实存在于JVM中的某个地方,您会遇到什么崩溃?可能是