通过start方法运行线程需要什么?我们为什么不直接调用run方法?
What will happened if combined the code of start() and run()
to make it as single method run()
不要解释两种方法之间的区别,我想了解这种情况。
答案 0 :(得分:3)
When program calls start() method a new Thread is created and code inside run() method is executed in new Thread while if you call run() method directly no new Thread is created and code inside run() will execute on current Thread.
每个线程都在一个单独的调用堆栈中启动。
从主线程调用run()方法,run()方法进入当前调用堆栈而不是新调用堆栈的开头。
请参阅What if we call run() method directly instead start() method?并阅读Difference between start and run method in Thread
答案 1 :(得分:2)
您需要知道线程可以具有不同的状态。基于http://www.tutorialspoint.com/java/java_multithreading.htm,有5种状态的线程
notify
方法来通知此线程它已完成
run
方法只包含在线程工作时需要执行的代码(当它处于 runnable 状态时)。
start
方法来处理从new
到runnable
的威胁状态,以便它可以开始工作并使用自己的资源(例如处理器时间)来执行来自run
方法的代码。
当您从yourThread.run()
调用run
代码时,将由调用此方法的线程执行,但如果您使用yourThread.start()
,则会执行run
方法中的代码使用yourThread
。
看一下这个例子
public static void main(String[] args) {
System.out.println("main started");
Thread t = new Thread(){
public void run() {
try {Thread.sleep(2000);} catch (InterruptedException consumeForNow) {}
System.out.println("hello from run");
};
};
t.run();
System.out.println("main ended");
}
run
方法中的代码将暂停运行它的线程两秒钟(由于Thread.sleep(2000);
),因此您可以在两秒钟后看到hello from run
。
现在输出看起来像这样
main started
hello from run
main ended
因为run
方法中的代码是由 main 线程(处理public static void main(String[] args)
方法的一个)执行的,也是因为有两秒钟的暂停部分
hello from run
main ended
后来印了。
现在,如果您将t.run()
更改为t.start()
,run
方法中的代码将由t
线程执行。您将通过观察结果
main started
main ended
(从主流)和两秒后
hello from run
答案 2 :(得分:1)
run()
方法定义了线程将执行的操作。 start()
方法启动线程以执行run方法实现的任务。
如果直接调用run
方法,则由调用者线程执行。但是,start
方法导致在新启动的线程中处理任务。在前一种情况下,调用者线程等待run方法完成。另一方面,在后一种情况下,新创建的线程异步执行,因此调用者线程继续其工作而不等待run方法的完成。
答案 3 :(得分:0)
如果直接调用线程的run()方法,那么该方法内部的代码将在调用run()方法的线程中运行。调用start()将创建一个新线程并在新线程的run()方法中执行代码。
简单地直接调用run()可能是一个错误,因为你实际上并没有创建一个新的线程。
请参阅以下链接以获取参考。
http://javarevisited.blogspot.co.uk/2012/03/difference-between-start-and-run-method.html
答案 4 :(得分:0)
简单来说
调用
Thread.start
以启动新主题。
如果直接调用run
方法,那就像在同一个线程中调用普通方法一样。
JavaDoc - Thread#start()提出了什么:
使该线程开始执行; Java虚拟机调用此线程的
run
方法。
请参阅Defining and Starting a Thread Java教程