黑马程序员技术交流社区
标题:
为什么启动线程时不能直接调用run()方法
[打印本页]
作者:
张青峰
时间:
2012-2-9 00:01
标题:
为什么启动线程时不能直接调用run()方法
本帖最后由 张青峰 于 2012-2-9 09:02 编辑
为什么启动多线程时不能直接调用run()方法,而必需通过start()方法启动?
作者:
彭沛东
时间:
2012-2-9 00:06
虽然run()方法实现了多个线程的并行处理,但不能直接调用run()方 法,而是通过start()方法来调用.在调用start()的时候,start方法会首先 进行与多线程相关的初始化,然后再自动调用run()方法.
作者:
Joyuang
时间:
2012-2-9 00:08
本帖最后由 钱兆元 于 2012-2-9 00:10 编辑
public class TestThread1 {
public static void main(String[] args) {
Runner1 r = new Runner1();
// r.run();//这是方法调用,而不是开启一个线程
Thread t = new Thread(r);// 调用了Thread(Runnable target)方法。且父类对象变量指向子类对象。
t.start();
for (int i = 0; i < 100000; i++) {
if(i%10000==0){
System.out.println("main");
}
}
}
/*
* run的运行结果:
* 先显示10个thread,再来上10个main,
* 表示使用run方法调用的时候相当于一般的过程调用,并没有加入到线程中区
* start的运行结果:
* thread和main是穿插进行的,就表示该方法已经加入了线程中去
*/
}
class Runner1 extends Thread {
public void run() {
for (int i = 0; i < 100000; i++) {
if(i%10000==0){
System.out.println("thread");
}
}
}
}
复制代码
run方法中存放的是线程运行任务代码,start方法开启线程,实现多线程。
调用start方法开启线程并运行run方法。
作者:
张建银
时间:
2012-2-9 00:14
run是线程运行的过程,start只是给线程运行一个口令罢了,就好比运动员跑步,须等裁判吹口哨才能跑起来
如果说没有用start方法,那么run方法只能放在Thread的构造方法中去完成了,这样Thread只是一个普通的java对象,此时在Thread构造方法中打印当前线程名称仍然是Thread-main,此时的new Thread()就是一个简单的java对象,而不能起到线程的作用
作者:
李晓斌
时间:
2012-2-9 00:46
run方法只是用于存放线程要运行的代码,调用run方法只是执行该方法,就是很普通的调用方法,不能同时运行多个run方法,因此并未达到多线程的目的,start方法是先开启线程,随后再调用Runnable接口子类中的run方法,若要多线程的话,只需再start其他线程就行了
作者:
刘元霄
时间:
2012-2-9 01:16
start 就调用了run方法的。 直接调用就是主线程了,通过start 调用了run的同时还启动线程!
作者:
任奇
时间:
2012-2-9 11:46
虽然run()方法实现了多个线程的并行处理,但不能直接调用run()方法,而是通过start()方法来调用。在调用start()的时候,start方法会首先进行与多线程相关的初始化,然后再自动调用run()方法。
start()方法
– 线程调用该方法启动一个线程,使之从新建状态进入就绪队列排队,一旦轮到它来使用CPU资源时,就可以脱离创建它的主线程独立开始自己的生命周期。
run()方法
– 线程的所有活动都是通过线程体run()方法来定义并实现它被调用以后所执行的操作。
作者:
浅入深出
时间:
2012-8-12 19:43
start()方法自动建立并启动线程,使之进入就绪态,当CPU给它分配时间时,由JVM调度执行run()方法。当然,一个start()方法可以启动多个线程,而一个run()方法只能执行输入自己的代码体
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2