在Java的多线程概念中,start()和run()是两个最重要的方法。下面是Thread.start()和Thread.run()方法之间的一些区别:
- 新线程创建:当程序调用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()方法被称为常规函数调用。
- 多次调用:在Java的多线程概念中,start()方法和run()方法之间的另一个最重要的区别是,我们不能两次调用start()方法,否则它将引发IllegalStateException,而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(); 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() 创建一个新线程,并在新创建的线程上执行run()方法。 没有创建新线程,并且在调用线程本身上执行了run()方法。 不能被多次调用,否则抛出java.lang.IllegalStateException 可以多次调用 在java.lang.Thread类中定义。 在java.lang.Runnable接口中定义,必须在实现类中重写。
相关用法
注:本文由纯净天空筛选整理自raman_257大神的英文原创作品 Difference between Thread.start() and Thread.run() in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。