📜  Java多线程中的 start()函数有什么作用?

📅  最后修改于: 2022-05-13 01:54:56.036000             🧑  作者: Mango

Java多线程中的 start()函数有什么作用?

我们已经讨论过Java线程通常是使用以下两种方法之一创建的: (1) 扩展线程类。 (2) 实现Runnable
在这两种方法中,我们都覆盖了 run()函数,但是我们通过调用 start()函数来启动一个线程。那么我们为什么不直接调用重写的 run()函数呢?为什么总是调用 start函数来执行线程?
调用函数时会发生什么?
当一个函数被调用时,会发生以下操作:

  1. 对参数进行评估。
  2. 一个新的堆栈帧被压入调用堆栈。
  3. 参数被初始化。
  4. 方法体被执行。
  5. 返回值并从调用堆栈中弹出当前堆栈帧。

start() 的目的是为线程创建一个单独的调用堆栈。它创建了一个单独的调用堆栈,然后由JVM调用run()。
让我们看看如果我们不调用 start() 而是直接调用 run() 会发生什么。我们已经修改了这里讨论的第一个程序。

Java
// Java code to see that all threads are
// pushed on same stack if we use run()
// instead of start().
class ThreadTest extends Thread
{
  public void run()
  {
    try
    {
      // Displaying the thread that is running
      System.out.println ("Thread " +
                Thread.currentThread().getId() +
                " is running");
 
    }
    catch (Exception e)
    {
      // Throwing an exception
      System.out.println ("Exception is caught");
    }
  }
}
 
// Main Class
public class Main
{
  public static void main(String[] args)
  {
    int n = 8;
    for (int i=0; i


输出:

Thread 1 is running
Thread 1 is running
Thread 1 is running
Thread 1 is running
Thread 1 is running
Thread 1 is running
Thread 1 is running
Thread 1 is running

我们可以从上面的输出中看到,我们为所有线程获得了相同的 id,因为我们直接调用了 run()。调用 start() 的程序会打印不同的 id(请参阅此)
参考:

  • http://www.javatpoint.com/what-if-we-call-run()-method-directly
  • http://www.leepoint.net/JavaBasics/methods/methods-25-calls.html