Thread类的start方法如何创建新堆栈并执行run方法

时间:2013-11-25 05:27:50

标签: java multithreading

有些人可以帮我理解下面的问题: -

  1. 创建新堆栈时?执行Thread t=new Thread()t.start()
  2. start()方法调用如何实现run()
  3. 我们可以为JVM这样的每个线程分配内存吗?如果否,JVM将如何修改正在运行的线程的堆栈内存。

2 个答案:

答案 0 :(得分:1)

  1. 在调用Start()方法时创建堆栈,直到创建所需的信息 堆栈不可用。

  2. 您调用的Thread类在其start方法中运行后调用此代码。 [实际上它是Start()方法实际上创建了一个新线程(不是Thread类,而是 真正的进程thrad)并在新线程中调用run()。例如:如果你调用run()而不是start ()在你的runnable类中。不会创建新的线程。]

  3. 没有。我们无法为线程分配特定的内存量。

答案 1 :(得分:1)

来自Thread的Javadoc:

  

线程是程序中执行的线程。 Java虚拟机允许应用程序同时运行多个执行线程。

     

每个帖子都有优先权。具有较高优先级的线程优先于具有较低优先级的线程执行。每个线程可能也可能不会被标记为守护进程。当在某个线程中运行的代码创建一个新的Thread对象时,新线程的优先级最初设置为等于创建线程的优先级,并且当且仅当创建线程是守护进程时才是守护进程线程。

     

当Java虚拟机启动时,通常会有一个非守护程序线程(通常调用某个指定类的名为main的方法)。 Java虚拟机继续执行线程,直到发生以下任一情况:

  1. 已调用类Runtime的exit方法,安全管理器已允许退出操作。
  2. 所有非守护程序线程的线程都已死亡,无论是通过从run方法调用返回还是抛出传播超出run方法的异常。
  3. 现在,问题。

    • 什么时候创建新堆栈?在执行Thread t = new Thread()或t.start()?

    构造函数创建一个新线程。它使用start方法运行。

    • start()方法调用如何实现run()?

    来自Thread的源代码:

    public void run() {
        if (target != null) {
             target.run();
        }
     }
    
    • 我们可以为JVM等每个线程分配内存吗?如果否,JVM将如何修改正在运行的线程的堆栈内存。

    不,您无法为每个线程分配内存。操作系统(Windows,Unix,OS X)控制线程的创建和销毁方式。 JVM可以通过字符串标识符访问每个线程。

    您可以阅读Thread source code以获取有关Thread类的更多信息。