为什么我们需要通过start方法运行线程而不是直接通过run方法运行?
答案 0 :(得分:6)
run
方法只在当前线程中执行线程的任务。从历史上看,您可以继承Thread
并覆盖run
- 尽管今天首选的机制是将Thread
构造函数传递给Runnable
。所以run
本身不做任何线程 - 它是start
创建一个新的“实际”线程(而不仅仅是Thread
对象)并使其执行run()
什么时候开始。
答案 1 :(得分:3)
因为run
方法包含新线程应该执行的代码。
如果您要调用run
方法,那么您只需在当前线程上执行它。
调用start
启动新线程,然后在新线程上执行run
方法。
答案 2 :(得分:1)
start()
方法告诉JVM它需要创建系统特定的线程。创建系统资源后,它会将Runnable
对象传递给它以执行其run()
方法。直接调用run()
方法会使“Thread”在与调用对象相同的线程中执行,而不是按照预期在单独的执行线程中执行。
换句话说,调用run()
就像普通的方法调用一样。然而,调用start()
告诉线程创建必要的系统资源,然后异步执行run()
方法。
修改强>
例如,
伪码1:
thread one = new thread();
thread two = new thread();
one.run();
two.run();
这使得线程顺序运行,即two.run();
仅在one.run();
完成后才会运行。
伪代码2:
thread one = new thread();
thread two = new thread();
one.start();
two.start();
在这种情况下,两个线程同时启动和运行。
start()
方法异步调用run()
方法(不等待任何结果,只是触发一个动作),但是当我们调用run()
时,它会同步运行,即它等到run()
完成,然后才进入下一行代码。
答案 3 :(得分:0)
Thread
中的总是在Stack Memory
中创建。当你创建一个新的Thread时,它会在Stack中占用新的内存。当你调用start()
方法时,它会在新的{{1}中初始化当你调用Stack Memory
方法时,它会在同一个run()
中初始化
这就是为什么我们总是使用Stack Memory
方法
Thread