黑马程序员技术交流社区
标题:
线程调用问题
[打印本页]
作者:
_王涛
时间:
2013-3-31 11:16
标题:
线程调用问题
本帖最后由 _王涛 于 2013-3-31 20:52 编辑
class Demo extends Thread{
public void run(){
for(int i=0;i<10;i++){
System.out.println("run demo"+i);
}
}
}
public class ThreadDemo {
public static void main(String args[]){
Demo d=new Demo();
d.start();
}
}
我们在运行线程时,d.run();与d.start();这两步该怎么理解呢?老师说d.run();调用的是run方法,而d.start(),也是
为了调用线程中的run方法,二者有什么区别呢?开启线程是个什么概念?
作者:
lucy198921
时间:
2013-3-31 11:20
1 start:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。
通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,
一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2 run:
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,
其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
作者:
张超
时间:
2013-3-31 12:26
1 先要理解什么是线程,线程的是一个程序的执行线索,开启线程就是给程序能创造一个执行线索。
2 d.run();与d.start();这两步该怎么理解呢?
d.run()当程序执行到这里的时候不会创建新的执行线索,也就是还按照以前的执行线索运行也就是主线程,
而d.start()是指的是一个继承Thread或者实现Runnable的对象调用关于一个start()的方法,就是是开启一个线程,
这个地方你可以去看一下start()d的源代码看是怎么实现的。
下面我给你试试他们的区别
注意一下运行的结果
class Demo extends Thread{
public void run(){
for(int i=0;i<10;i++){
System.out.println("run demo"+i);
}
}
} class ThreadDemo {
public static void main(String args[]) throws InterruptedException{
Demo d=new Demo();
//d.start();
d.run();
Thread.currentThread().sleep(50);
System.out.println("main thread 休息5秒");
}
}
作者:
杨玉辉
时间:
2013-3-31 15:42
你可以这么看,d.run(),是主线程按照先后顺序执行,执行完再往下执行其它线程,这是在保证该主程序可以执行完的前提下。
d.start() 是与主线程里的其它线程交替执行,没有主次之分,具体执行哪一个,交给cpu分配
开启线程:通常所说的线程,多数就是指多线程,就是一个程序一执行,这个程序内部各个可能会用到的功能,就基本处于待命状态,你点击启动后,就会开辟一个或多个线程吧,按照预先设计好的执行顺序,实现功能,方便高效。 继承Thread 类 一般只用于启动一个程序的线程。
作者:
王俊杰
时间:
2013-3-31 17:28
记得有人问过这个问题。我把我当时的回复粘贴过来吧~~
我对这个问题理解得也不是很深刻。我查找了一下《Java语言程序设计》里面的内容。
线程有5种状态,新建,就绪,运行,阻塞和终止。
start()用来启动一个线程,让这个线程进入可调度状态,线程获得调度的时候会自动执行run()
run()是由调度程序调用的,run()返回的时候该线程就进入终止状态了
我们用start方法将线程置于可调度状态就可以了。这样线程就等着java的线程调度器来调度它了。
共同学习,共同进步!!
作者:
杜加璇
时间:
2013-3-31 19:34
class Demo extends Thread{
public void run(){
for(int i=0;i<10;i++){
System.out.println("run demo"+i);
} 这里相当于你创建了一个多线程如果你不调用start方法开启的话的话,这个线程是不会执行的。执行d.start(),线程开启run方法也会被执行。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2