黑马程序员技术交流社区
标题:
非构造函数创建对象后直接调用的问题
[打印本页]
作者:
强文何
时间:
2012-5-17 14:11
标题:
非构造函数创建对象后直接调用的问题
我一直有这样的一个疑问:在创建线程的时候,重写了父类的run()方法,但是不是构造方法。使用时为什么不是使用对象名.run()的形式?它内部的实现原理是什么?我找了java的源代码发现没有?它只是一个抽象类。
作者:
魏涞
时间:
2012-5-17 15:45
你能把代码贴出来吗,这样有益于解答。
作者:
宗士为
时间:
2012-5-17 15:56
创建线程有两个方法
1.继承Thread类
定义类继承Thread, 重写run()方法, 将线程中要执行的代码写在run()方法中
创建该类对象, 调用start()方法就可以开启一条新线程, 新线程中自动指定run()方法
2.实现Runnable接口
定义类实现Runnable接口, 重写run()方法, 将线程中要执行的代码写在run()方法中
创建该类对象, 创建Thread类对象, 将Runnable对象传入Thread的构造函数中
调用Thread对象的start()方法就可以开启一条新线程, 新线程中执行Runnable的run()方法
作者:
麦田守望者0812
时间:
2012-5-17 16:01
任何一个线程的启动最终都需要经过某个Thread实例的start()方法,通过一个实现了Thread类的具体实例的构造方法或是通过调用run()方法并不意味着开启了新的线程
作者:
袁冬梅
时间:
2012-5-17 17:52
本帖最后由 袁冬梅 于 2012-5-17 18:07 编辑
我简单看了一下源码,我也不是很懂喔,不过我可以帮你解一点疑惑
首先在创建线程的时候,重写了父类的run()方法,但是不是构造方法。使用时为什么不是使用对象名.run()的形式?
看到Thread类源码中有这样一句话group.add(this);
。
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
复制代码
然后我发现,这句话就是创建了一个新的线程,你可以去ThreadGroup类中查看void add(Thread t) 这个方法,就发现它在线程族里面新添加一个线程进去,所以,在Thread在进行start的时候是创建了一个新的线程,而你说的构造函数,我看了一下,构造函数做的工作其实只是对一个新创建出来的Thread进行初始化工作,而没有把这个线程对象加入线程族中,那么就说明此时新线程其实是没有创建出来的。
然后,你说的使用 对象.run()吧,你看你直接用了Thread的你自己创建的对象使用run,但是,你没有经过start把你创建好的Thread对象加入线程组里面,那么它运行起来的时候就不是一个新线程。怎么说呢?你看下面的代码,我帮你做了一个小小的测试,希望能帮助到你理解线程的创建
Thread t = new Thread(){
@Override
public void run() {
System.out.println("复写父类的run方法");
System.out.println("此时run方法是在"+Thread.currentThread().getName()+"线程里面运行");
}
};
t.run(); //检测通过对象直接调用run方法运行的时候,run方法是在哪个线程中运行
t.start(); //检测start方法创建了线程之后,run方法是在哪个线程中运行
/*结果:
复写父类的run方法
此时run方法是在main线程里面运行
复写父类的run方法
此时run方法是在Thread-0线程里面运行*/
复制代码
作者:
袁冬梅
时间:
2012-5-17 18:08
额,忘记说了,第二段代码我是放在main方法中的,你要试验的话也要把代码放在main方法中哈
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2