• Tags
  •         
  • www.breakyizhan.com
  •    

    我们已经讨论过通常使用以下两种方法之一创建Java线程:(1)扩展线程类。(2)实现Runnable

    在这两种方法中,我们都覆盖了run()函数,但是我们通过调用start()函数来启动一个线程。那么为什么我们不直接调用oveerridden run()函数呢?为什么总是调用start函数来执行一个线程?

    调用start()函数时会发生什么?

    调用函数时,将执行以下操作:

    1. 参数被评估。
    2. 新的堆栈帧被推入调用堆栈。
    3. 参数已初始化。
    4. 方法体被执行。
    5. 值被重新调整,当前堆栈帧从调用堆栈中弹出。

    start()的目的是为线程创建一个单独的调用堆栈。它创建一个单独的调用堆栈,然后由JVM调用run()。

    start()函数在Java多线程的示例

    让我们看看如果我们不调用start()而是直接调用run()会发生什么。

    // 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<n; i++)
        {
          ThreadTest object = new ThreadTest();
    
          // start() is replaced with run() for
          // seeing the purpose of start
          object.run();
        }
      }
    }
    

    输出:

    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.

     
    转载请保留页面地址:https://www.breakyizhan.com/java/4943.html