Java 中 Thread.start() 和 Thread.run() 的区别

在 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() 方法两次,否则会抛出 IllegalStateExceptionrun() 方法可以被调用 多次,因为它只是一个普通的方法调用。
下面通过一个例子来理解它:

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

(0)
上一篇 2022年6月7日
下一篇 2022年6月7日

相关推荐

发表回复

登录后才能评论