Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于java中线程的几个问题_Java_Multithreading - Fatal编程技术网

关于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()
      将立即返回。它只向第二个线程发出开始工作的信号

    假设当我们点击一个按钮时buttonClicked()将被调用,所以我点击按钮几次,每次点击它,都会创建一个新的对象线程,所以在这种情况下,JVM中存在许多不同的“NewThread”对象

    事实上,如果与您的点击率相比,
    NewThread
    run()
    方法比较慢,那么您正在积累
    NewThread
    实例

    我确实喜欢这样,然后JVM崩溃

    你是说你喜欢点击按钮和下面的JVM崩溃?;-)

    编辑:问题更改/扩展后,出现第三点:

    在调用
    thread.abc()之前的
    buttonClicked()方法中
    如果
    thread.start()
    已经完成,我仍然可以调用thread对象
    thread.abc()

    当然,只要有引用,就可以调用对象上的任何方法<代码>线程
    在这里也不例外

    我认为您遇到的主要困难是:引用
    线程
    指向一个对象。这个对象不是真正的线程(注意小t),它只是一些小的内存区域,有一些关于真正线程的描述。真正的线程由一些CPU设置、OS调度程序、堆栈等组成


    对象和实际线程这两个对象的生命周期不是严格耦合的:对象
    线程
    在创建实际线程之前就存在(发生在
    线程.start()中
    )。真正的线程在离开
    run()
    方法后死亡。但是对象
    线程
    即使在这之后仍然存在,直到正常垃圾收集开始时(如前所述)。

    一个线程也被称为垃圾根,垃圾收集器不会清理它。GC通过使用垃圾收集器根集作为参考点来决定对象是否可访问。这也是垃圾收集器不能收集主线程的原因

    当不再有强引用时,对象进入无法访问状态 让它存在。当一个对象不可访问时,它是一个候选对象 收集注意措辞:仅仅因为对象是候选对象 因为收集并不意味着它将立即被收集。JVM 可自由延迟收款,直到立即需要 对象正在消耗的内存。重要的是要注意这一点 任何强引用都会在内存中保存一个对象。这些一定是 从垃圾收集根目录引用该链。GC根是一个 一类特殊的变量,包括

    堆栈上的临时变量(任何线程的)静态变量 (来自任何类)来自JNI本机代码的特殊引用


    摘自:

    我认为thread对象没有被破坏,您只是不能在代码中引用它,但它确实存在于JVM中的某个地方,您会遇到什么崩溃?可能是