线程类:
class NewThread extends thread{
public void abc(){
}
}
然后在另一个线程的方法中执行这些代码
public void buttonClicked(){
NewThread thread = new NewThread();
thread.start();
thread.abc();
}
好的,所以对象thread
的生命周期取决于方法buttonClicked
,所以如果方法返回,对象thread
即使thread.start()
也会被破坏1}}还在运行吗?
假设我们点击按钮时会调用buttonClicked()
。所以我多次单击该按钮,每次单击它时,都会创建一个新的对象thread
,在这种情况下,JVM中是否存在许多不同的“NewThread”对象?我喜欢这个,然后JVM崩溃,在我的电脑中,似乎我的java程序丢失了回答,我必须使用任务管理器来杀死java.exe,但有时它没关系,很奇怪!!
在buttonClicked()
方法中,如果thread.abc();
已经完成,则在调用thread.start()
之前,我是否仍可以调用线程对象thread.abc();
?
答案 0 :(得分:1)
好的,所以对象“thread”的生命周期取决于方法
buttonClicked
,所以如果方法返回,即使thread.start()
仍在运行,对象线程也会被破坏?
我在这里看到两个误解:
如果方法buttonClicked
返回,则对象的引用将消失。 NewThread
的对象实例将一直处于活动状态,直到没有人引用它为止,另外垃圾收集器决定回收该内存。这意味着,NewThread
的实例将至少与run()
的{{1}}方法一起运行,因为{{1}描述的线程堆栈实例引用该实例。 NewThread
终止时,该堆栈将被清除。
NewThread
会立即返回。它只表示第二个线程开始工作。
假设当我们单击一个按钮时会调用buttonClicked(),所以我多次单击该按钮,每次单击它时,都会创建一个新的Object线程,所以在这种情况下,有许多不同的“NewThread”对象存在于JVM中?
实际上,如果run()
thread.start()
方法与您的点击率相比较慢,则会累积NewThread
个实例。
我喜欢这样,然后JVM崩溃。
你的意思是你喜欢点击按钮和以下JVM崩溃? ;-)
修改:问题更改/扩展后,出现第三点:
在
run()
方法中,如果NewThread
已经完成,则在调用buttonClicked()
之前,我是否仍可以调用线程对象thread.abc();
?
当然,只要有引用,就可以在对象上调用任何方法。 thread.start()
在这里也不例外。
我认为你遇到的主要困难是:引用thread.abc();
指向一个对象。这个对象不真正的线程(注意小 t ),它只是一些小的内存区域,有一些关于真实线程的描述。真正的线程包括一些CPU设置,OS调度程序的东西,堆栈等等。
这两个的东西,对象和真实线程的生命周期没有严格耦合:对象Thread
在创建真实线程之前存在(发生在{{1 })。真正的线程在离开thread
方法后死亡。但是对象 Thread
甚至在此之后仍然存在,直到正常的垃圾收集开始,如上所述。
答案 1 :(得分:0)
退出方法后,线程不会被销毁。对线程的引用保存在“线程表”中,可以通过静态链接访问(因此线程不会被垃圾回收)。
答案 2 :(得分:0)
一个线程也被称为垃圾根,它不被垃圾收集器清理。 GC通过使用垃圾收集器根集合作为参考点来确定对象是否可访问。这也是垃圾收集器不收集主线程的原因。
当没有更多强引用时,对象进入无法访问状态 它存在。当一个对象无法访问时,它是一个候选对象 采集。请注意措辞:仅仅因为某个对象是候选对象 收集并不意味着它会立即收集。 JVM 可以自由延迟收集,直到需要立即收集 内存被对象占用。重要的是要注意不是 任何强引用都会在内存中保存一个对象。这些必须是 从垃圾收集根链接的引用。 GC根是一个 包含
的特殊变量类堆栈上的临时变量(任何线程)静态变量 (来自任何类)来自JNI本机代码的特殊引用
取自:http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#997428