黑马程序员技术交流社区
标题:
线程问题
[打印本页]
作者:
高双武
时间:
2011-11-10 10:11
标题:
线程问题
当我们创建一个新的线程后假如为Thread2,然后是Thread2.start();然后start()在调用run()方法,为什么不直接Thread2.run()?这样就运行了run()方法啊
作者:
姚志华
时间:
2011-11-10 10:20
run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;
start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程,
简单的说就是start()方法才是启动一个新线程,run()方法你调用多少次都是在主程序里执行的,就像调其它方法不会启动线程一样
作者:
柴永菲
时间:
2011-11-10 10:26
start()的作用是: 启动线程 运行run方法
stat()用于自动调用run(),这是JAVA的内在机制规定的
希望能帮到你
作者:
贺洪京
时间:
2011-11-10 10:30
刚才我看了一下Thread这个类的源码,我也没看太懂,大概是这个意思
下边是start方法的源代码:
public synchronized void start() {
if (started)
throw new IllegalThreadStateException();
started = true;
group.add(this);
start0();
}
首先是一个started它是Thread类的一个成员变量来判断线程的状态,一般为true否则会抛出异常。
下边group.add(this);
group是ThreadGroup类的对象,代表的是线程组,我个人认为它可能是要把你创建的新线程注册到线程组当中,在这个线程组中要初始化好多参数,所以我想可能是为了安全和Thread的实现机制有关吧
作者:
せR3n、何必装纯
时间:
2011-11-10 13:03
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,
这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
作者:
wangqing
时间:
2011-11-10 13:19
start()启用线程,并调用run(),如果直接Thread2.run()仅仅是对象调用,而创建的线程并没有运行。
如
class Demo extends Thread
{
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println("创建的新线程");
}
}
}
class ThreadDemo
{
public static void main(String args[])
{
Demo d=new Demo();
d.run();
for(int i=0;i<10;i++)
{
System.out.println("主线程");
}
}
}
如果如上面,程序会执行完Demo中的run(),输出10行“创建的新线程”再执行主函数里的输出语句,输出10行“主线程”
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2