当前位置:  开发笔记 > 编程语言 > 正文

你何时会调用java的thread.run()而不是thread.start()?

如何解决《你何时会调用java的thread.run()而不是thread.start()?》经验,为你挑选了9个好方法。

你什么时候打电话给Java thread.run()而不是thread.start()



1> Paul Croarki..:

您可能希望在特定单元测试中调用run(),该测试严格关注功能而不是并发.



2> Adam Crume..:

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


"从不"有点过于绝对.也许并不总是想要一个新的线程,仍然执行代码?
也许吧,但是在这种情况下,创建一个新的Thread只会调用run()方法是不必要的浪费.最好创建一个Runnable impl,然后运行in-thread或构造并用它启动一个新的Thread.
它是公共的,因为Thread实现了Runnable.您可以继承Thread并覆盖run(),这与将代码放入Runnable并将其传递给Thread构造函数具有相同的效果.但是,最好使用单独的Runnable对象,因为这样可以提高灵活性(例如将其传递给Executor等).
让我举一个我正在使用的具体示例:我有一个程序可以作为GUI或从命令行运行.在GUI的情况下,我希望执行繁重工作的对象在单独的线程上运行并向gui发送更新.在命令行模式下,我不需要那个单独的线程.

3> Tomalak..:

采用代码样式Java线程FAQ:

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

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

Thread类的run()方法不执行任何操作,因此子类应该使用代码覆盖该方法以在第二个线程中执行.如果使用Runnable参数实例化Thread,则线程的run()方法将在新线程中执行Runnable对象的run()方法.

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



4> Mahendra Liy..:

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

执行thread.start()创建一个新的OS级别线程,其中该run()方法被调用.

在本质上:

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

多线程编程→调用start()方法

此外,正如其他人所提到的,"测试"似乎是唯一可行的情况,您可以run()直接从您的代码中调用.



5> Scott Bale..:

这已经被提到了,但只是要明确:创建一个新的Thread对象只是为了调用它的run()方法是不必要的昂贵,应该是一个主要的红旗.创建一个Runnable impl并且(a)直接调用它的 run()方法(如果这是所需的行为),或(b)用该Runnable构造一个新的Thread并启动Thread ,这将是一个更好,更分离的设计.

更好的是,为了进一步解耦,请查看ExecutorJDK 5及更新版本中的接口和框架.这使您,简单地说,从分离的任务执行(Runnable接口实例)如何执行它(执行人执行,这可能会从池中执行的Runnable在当前线程,在一个新的线程,使用现有的线程,和诸如此类的东西).



6> Chris Ballan..:

打电话thread.start(),它会依次打电话thread.run().当你想要绕过thread.start()并直接进入时,想不到一个案例thread.run()


测试期间是我能想到的唯一合法案例.否则,run()的内容应该在一个单独的方法中,该方法可以通过run或其他方式调用.

7> 小智..:

Thread类中的单独start()run()方法提供了两种创建线程程序的方法.该start()方法开始执行新线程并调用该run()方法.该start()方法立即返回,新线程通常继续,直到该run()方法返回.

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

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

参考



8> Steer360..:

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

/*
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");

    }
}



9> Brian..:

当您希望它同步运行时.调用run方法实际上不会给你多线程.start方法创建一个调用run方法的新线程.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有