你什么时候调用java的thread.run()而不是thread.start()?

…这个问题说的就是我相信的一切!

你可能想在特定的unit testing中调用run(),这个unit testing严格地关注于function而不是关注并发。

决不。 直接调用run()只是同步执行代码(在同一个线程中),就像普通的方法调用一样。

采取代码风格的Java线程常见问题解答 :

问:线程的start()和run()方法有什么区别?

答:Thread类中的单独start()和run()方法提供了两种创build线程化程序的方法。 start()方法启动新线程的执行并调用run()方法。 start()方法立即返回,新线程通常继续,直到run()方法返回。

Thread类的run()方法什么都不做,所以子类应该用第二个线程中要执行的代码覆盖方法。 如果使用Runnable参数实例化一个线程,则线程的run()方法改为执行新线程中的Runnable对象的run()方法。

根据线程化程序的性质,直接调用Thread run()方法可以提供与通过start()方法调用相同的输出,但在后一种情况下,代码实际上是在新线程中执行的。

执行thread.run()不会创build一个代码执行的新Thread 。 它只是执行调用thread.run()代码的当前线程中的代码。

执行thread.start()会创build一个新的操作系统级别的线程,其中run()方法被调用。

在本质上:

单线程编程→直接调用run()方法

multithreading编程→调用start()方法

而且,正如其他人所提到的,“testing”似乎是您可以直接从您的代码中直接调用run()的唯一可取的情况。

这已经被提到了,但是要清楚的是:创build一个新的Thread对象只是为了调用它的run()方法是不必要的昂贵,应该是一个重要的红旗。 这将是一个更好,更分离的devise来创build一个Runnable impl,或者(a)直接调用它的 run()方法,如果这是所需的行为,或者(b)用该Runnable构造一个新的Thread并启动Thread。

更好的是,为了实现更多的解耦,请查看JDK 5及更新版本中的Executor接口和框架。 这使得您可以简单地将任务执行(Runnable实例)与它的执行方式(Executor实现,它可以在一个新的Thread中执行当前Thread中的Runnable,使用池中现有的Thread,和什么)。

调用thread.start() ,它将依次调用thread.run() 。 当想要绕过thread.start()并直接转到thread.run()

Thread类中的单独start()run()方法提供了两种创build线程化程序的方法。 start()方法启动新线程的执行并调用run()方法。 start()方法立即返回,新线程通常继续,直到run()方法返回。

Thread类的run()方法什么都不做,所以子类应该用第二个线程中要执行的代码覆盖方法。 如果使用Runnable参数实例化一个线程,则线程的run()方法改为执行新线程中的Runnable对象的run()方法。

根据线程化程序的性质,直接调用Thread run()方法可以提供与通过start()方法调用相同的输出,但在后一种情况下,代码实际上是在新线程中执行的。

参考

如果问题是 – “为什么线程启动方法被调用,而不是直接运行方法”,那么我已经回答了下面的示例代码。 希望澄清。 在下面的例子中:

 /* By calling t1.start(), we are getting the main calling thread returned immediately after the t1.start() called and is ready to proceed for other operations.And the thread t1 starts executing the run method of the object r. Hence the the output will be: I am the main thread , i created thread t1 and had it execute run method, which is currently looping from 0 to 1000000 I am done executing run method of testThread */ /* If we call t1.run() instead of t1.start(), (just replace t1.start() with t1.run() in the code for testing) its like a regular method call and the main thread will not return until the run method completes, hence the output will be: I am done executing run method of testThread I am the main thread , i created thread t1 and had it execute run method, which is currently looping for i to 1000000 */ class testThread implements Runnable{ public void run() { for(int i=0;i<1000000;i++){} //a simple delay block to clarify. System.out.println("I am done executing run method of testThread"); } } public class mainClass{ public static void main(String [] args) { testThread r = new testThread(); Thread t1 = new Thread(r); t1.start(); /* Question is: can we call instead t1.run() */ System.out.println("I am the main thread , i created thread t1 and had it execute run method, which is currently looping for i to 1000000"); } } 

当你想要它同步运行。 调用run方法实际上不会给你multithreading。 start方法创build一个调用run方法的新线程。

如果你想像执行其他方法一样执行run()的内容。 当然不是开始一个线程。

假设你知道启动和运行方法的用法,即同步与asynchronous; 运行方法可以用来testingfunction。

另外,在某些情况下,同一个线程类可以在两个不同的地方使用,具有同步和asynchronousfunction要求,通过使用一个run方法和另一个start方法调用两个不同的对象。

至less在JVM 1.6中,有一些检查和运行是本地调用的:

  public synchronized void start() { /** * This method is not invoked for the main method thread or "system" * group threads created/set up by the VM. Any new functionality added * to this method in the future may have to also be added to the VM. * * A zero status value corresponds to state "NEW". */ if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); start0(); if (stopBeforeStart) { stop0(throwableFromStop); } } private native void start0(); 

只要注意以上好评:有时候你会写一个使用“start”方法运行不同线程的multithreading代码。 如果您使用“run”(而不是“start”)进行debugging,您会发现它更容易,因为它使代码同步运行并debugging起来更容易。

 public class TestClass implements Runnable { public static void main(String[] args) { TestClass tc = new TestClass(); Thread t1 = new Thread(tc); System.out.println("Before Starting Thread " + Thread.currentThread().hashCode()); t1.start(); System.out.println("After Starting Thread " + Thread.currentThread().hashCode()); } @Override public void run() { System.out.println("TestClass Run method is Running with thread " + Thread.currentThread().hashCode()); } }