📜  JavaThread.start()和Thread.run()的区别

📅  最后修改于: 2021-09-12 11:13:52             🧑  作者: Mango

在 Java 的多线程概念中, start()run()是两个最重要的方法。以下是 Thread.start() 和 Thread.run() 方法之间的一些差异:

  1. 新线程创建:当程序调用start()方法时,会创建一个新线程,然后执行run()方法。但是,如果我们直接调用run()方法,则不会创建新线程,并且run()方法将作为对当前调用线程本身的普通方法调用执行,并且不会发生多线程。
    让我们通过一个例子来理解它:
    class MyThread extends Thread {
        public void run()
        {
            System.out.println("Current thread name: "
                               + Thread.currentThread().getName());
            System.out.println("run() method called");
        }
    }
      
    class GeeksforGeeks {
        public static void main(String[] args)
        {
            MyThread t = new MyThread();
            t.start();
        }
    }
    
    输出:
    Current thread name: Thread-0
    run() method called
    

    正如我们在上面的例子中看到的,当我们调用线程类实例的start()方法时,会创建一个默认名称为Thread-0的新线程,然后调用run()方法,其中的所有内容都在新创建的线程。
    现在,让我们尝试直接调用run()方法而不是start()方法:

    class MyThread extends Thread {
        public void run()
        {
            System.out.println("Current thread name: "
                               + Thread.currentThread().getName());
      
            System.out.println("run() method called");
        }
    }
      
    class GeeksforGeeks {
        public static void main(String[] args)
        {
            MyThread t = new MyThread();
            t.run();
        }
    }
    
    输出:

    Current thread name: main
    run() method called
    

    正如我们在上面的例子中看到的,当我们调用我们的 MyThread 类的run()方法时,没有创建新线程并且run()方法在当前线程即线程上执行。因此,没有发生多线程。 run()方法作为普通函数调用被调用。

  2. 多次调用:在 Java 的多线程概念中, start()run()方法之间另一个最重要的区别是我们不能调用start()方法两次,否则会抛出IllegalStateExceptionrun()方法可以调用多次,因为它只是一个普通的方法调用。
    让我们通过一个例子来理解它:
    class MyThread extends Thread {
        public void run()
        {
            System.out.println("Current thread name: "
                               + Thread.currentThread().getName());
      
            System.out.println("run() method called");
        }
    }
      
    class GeeksforGeeks {
        public static void main(String[] args)
        {
            MyThread t = new MyThread();
            t.start();
            t.start();
        }
    }
    

    输出

    Current thread name: Thread-0
    run() method called
    Exception in thread "main" java.lang.IllegalThreadStateException
        at java.lang.Thread.start(Thread.java:708)
        at GeeksforGeeks.main(File.java:11)
    

    正如我们在上面的例子中看到的,再次调用start()方法会引发Java.lang.IllegalThreadStateException
    现在,让我们尝试两次调用run()方法:

    class MyThread extends Thread {
        public void run()
        {
            System.out.println("Current thread name: "
                               + Thread.currentThread().getName());
            System.out.println("run() method called");
        }
    }
      
    class GeeksforGeeks {
        public static void main(String[] args)
        {
            MyThread t = new MyThread();
            t.run();
            t.run();
        }
    }
    
    输出:
    Current thread name: main
    run() method called
    Current thread name: main
    run() method called
    

    正如我们在上面的例子中看到的那样,两次调用run()方法不会引发任何异常,并且它按预期执行了两次,但在线程本身上执行。

    概括

    start() run()
    Creates a new thread and the run() method is executed on the newly created thread. No new thread is created and the run() method is executed on the calling thread itself.
    Can’t be invoked more than one time otherwise throws java.lang.IllegalStateException Multiple invocation is possible
    Defined in java.lang.Thread class. Defined in java.lang.Runnable interface and must be overriden in the implementing class.