Anu*_*Anu 40 java multithreading
为什么我们调用线程对象的start()方法又轮流调用run()方法,为什么不直接调用run()方法呢?
aio*_*obe 67
[...]为什么我们不直接调用run()方法?
该run()方法只是一种普通方法(由您覆盖).与任何其他普通方法一样,直接调用它将导致当前线程执行run().
所有魔法里面发生start().该start()方法将导致JVM生成新线程并使新生成的线程执行run().
use*_*551 16
即使以编程方式我们没有创建任何线程,对于每个应用程序,OS都会创建一个默认线程来用CPU执行其代码.
直接调用run方法将使该run方法在OS给出的主线程中执行
但是创建线程类的目的是确保run方法在不同的线程中执行.除非OS的线程管理器创建一个线程,否则您的run方法将不会在单独的线程中执行.要请求OS创建单独的线程,您必须调用start()方法,该方法将向OS发送请求以创建线程.一旦OS创建了一个线程,OS就会在新创建的线程上下文中自动调用线程类的run方法.因此,您将提供创建单独线程并在单独线程中执行run方法的目的.
如果你直接调用run方法,那就像OS没有为你创建任何线程,默认主线程将执行你的run方法.没有必要为它创建一个单独的线程类!
希望我很清楚.如果您需要更多解释来回答您的问题,请与我们联系.
注意:虽然书籍说JVM创建线程,但内部JVM必须向OS层的线程管理器驱动程序发送请求,以在其线程池中创建新线程.这就是我在这里使用OS术语比JVM更多的原因.
use*_*421 10
为什么我们调用线程对象的start()方法,该方法又调用run()方法
不,不.start()调用操作系统,该操作系统启动一个新线程,(大大简化)调用该run()方法.同时该start()方法已经返回其调用者.他们并不等同.
Runnable只是一个界面.实现的类Runnable没什么特别的,它只是有一个run方法.
Thread#start是创建一个单独的线程和调用本机实现的方法Thread的run方法中,在新的线程执行的代码.
Thread实施Runnable.run看起来像这样的代码:
@Override
public void run() {
if (target != null) {
target.run();
}
}
Run Code Online (Sandbox Code Playgroud)
如果Thread实例是通过传递一个创建Runnable的Thread的构造函数中,Runnable的run方法被调用.
否则,扩展类Thread必须覆盖该run方法才能start工作.
呼吁run在Thread不创建一个新的线程.
| 归档时间: |
|
| 查看次数: |
68743 次 |
| 最近记录: |