黑马程序员技术交流社区
标题: 线程运行的问题 [打印本页]
作者: 罗雪梅 时间: 2012-10-7 12:18
标题: 线程运行的问题
本帖最后由 罗雪梅 于 2012-10-7 16:44 编辑
class MyThread extends Thread{
publicvoid run(){
try {
//让当前线程休眠3秒
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
}
System.out.println("MyThreadrunning");
}
}
public class ThreadTest{
publicstatic void main(String argv[]) {
MyThread t = new MyThread(); //创建线程
t.run(); //调用线程中的run()方法
t.start(); //启动线程
System.out.println("ThreadTest");
}
}
调用线程的run()方法,和启动线程t.start()这两句话的作用不是一样的吗,都是让run()方法运行起来。但是操作语句不一样,我想应该是有本质区别的,但看半天觉得就是在调用run()方法,没有其它的不同啊
作者: 严海荣 时间: 2012-10-7 12:37
有不同,直接调用run()主函数就去运行run方法了。
用start()调用run方法是分出一个线程运行,主函数继续往下运行的。
作者: 谭立文 时间: 2012-10-7 13:31
开启一个线程不同于普通的方法调用,都知道线程的生命周期,有新建-->排队---->执行---->(等待)----->消亡
若直接调用run方法那是方法调用,直接去运行run方法里的代码了,不是新开辟一条执行路径,因为具体这个run方法什么时候去调用由cpu来决定,当该线程获取到cpu的时间片时再执行,是随机的。这下面是start方法的源代码:
private ThreadGroup group;
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this); //可以看成来这个线程被加入到了一个队列当中了,得等到cpu轮转到该线程时再去执行
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
如果由我们自己直接去调用那就是一条执行路径了,因为一旦你调用了这条执行路径就不变了,不是由cpu决定的,不是随机的。
作者: AngieFans85 时间: 2012-10-7 13:55
直接调用run()方法,那就是在主线程里执行run()方法,程序会把run()方法的代码执行完后,主线程才会再往下执行.
而通过线程来start()调用,那么就不是在主线程执行run()方法中代码,而是JVM会开启一个分支的线程来执行run()方法中的代码,主线程和分支线程会并发执行(如果是单核的,那么同一个时间点只能有一个线程执行,哪个线程先执行哪个线程后执行由CPU说了算.如果是非单核,那么在同一个时间点,就可以真正意义上的做到两个线程同时执行.).
作者: 孙含庆 时间: 2012-10-7 14:04
class MyThread extends Thread{
publicvoid run(){
try {
//让当前线程休眠3秒
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
}
System.out.println("MyThreadrunning");
}
}
public class ThreadTest{
publicstatic void main(String argv[]) {
MyThread t = new MyThread();
t.run(); //这里是显式调run() 方法,是main 主线程在执行,单纯的调用这个方法,
// 不会启动新的线程。
t.start(); //只有调用 Thread 类或他子类的 start() 方法,虚拟机才会去创建一个
//新的线程,并默认在新线程里执行并调用 run() 方法体内的代码。
System.out.println("ThreadTest");
}
}
//JVM 只会用Thread 类来开启新的线程,并交予线程调度器去调度和管理,为该线程分配 CPU 资源,
//实现 Running 接口,也是这种做法。
作者: 黑马连家华 时间: 2012-10-7 15:02
简单地说,只有调用了start方法才算开启了多线程
只调用run方法只能算是普通的调用,它跟主函数共享一个线程
作者: 罗雪梅 时间: 2012-10-7 16:43
马镱洵 发表于 2012-10-7 13:55 
直接调用run()方法,那就是在主线程里执行run()方法,程序会把run()方法的代码执行完后,主线程才会再往下执行 ...
奥,这样的
作者: 罗雪梅 时间: 2012-10-7 16:43
谢谢大家
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |