关于java中的线程的一些问题

时间:2011-12-28 11:44:07

标签: java multithreading

线程类:

class NewThread extends thread{
    public void abc(){
    }
}

然后在另一个线程的方法中执行这些代码

public void buttonClicked(){
   NewThread  thread = new NewThread();
   thread.start();
   thread.abc();
}
  1. 好的,所以对象thread的生命周期取决于方法buttonClicked,所以如果方法返回,对象thread即使thread.start()也会被破坏1}}还在运行吗?

  2. 假设我们点击按钮时会调用buttonClicked()。所以我多次单击该按钮,每次单击它时,都会创建一个新的对象thread,在这种情况下,JVM中是否存在许多不同的“NewThread”对象?我喜欢这个,然后JVM崩溃,在我的电脑中,似乎我的java程序丢失了回答,我必须使用任务管理器来杀死java.exe,但有时它没关系,很奇怪!!

  3. buttonClicked()方法中,如果thread.abc();已经完成,则在调用thread.start()之前,我是否仍可以调用线程对象thread.abc();

3 个答案:

答案 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