黑马程序员技术交流社区
标题:
线程启动问题?
[打印本页]
作者:
zhangx
时间:
2013-4-17 20:14
标题:
线程启动问题?
本帖最后由 zhangx 于 2013-4-18 14:01 编辑
复习中只是记住但不理解的问题:
为什么启动线程不能直接使用run()方法?而拐弯使用start()方法启动?这样做有什么好处?
作者:
J_hom
时间:
2013-4-17 20:26
直接调用Thread类或Runnable类对象的run()方法,只会执行同一个线程的任务,而不会启动新线程。使用start方法,这个方法将创建一个执行run方法的新线程。
作者:
杨冉
时间:
2013-4-17 20:29
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
private native void start0();
@Override
public void run() {
if (target != null) {
target.run();
}
}
复制代码
其实看一下Thread类中相关方法的实现就明白了~
作者:
孤独的鸟人
时间:
2013-4-17 22:12
用 start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
所以调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
作者:
刘兆华
时间:
2013-4-17 23:52
如果直接的调用run()方法,那么就不是多线程了,run()方法就成了普通的成员方法。start()的功能是创建一个线程,调用run()方法。这个你可以去Java API文档中看看。
作者:
zhangx
时间:
2013-4-18 14:01
太混淆了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2