在 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 YiibaiDemo { 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 YiibaiDemo { 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()
方法两次,否则会抛出 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 YiibaiDemo { 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 YiibaiDemo.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 YiibaiDemo { 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 接口中定义并且必须在实现类中被覆盖。 |
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/264256.html