创建线程的2中传统方式:
1.在Thread子类覆盖的run方法中编写运行代码;
2.在传递给Thread对象的Runnable对象的run方法中编写代码
3.总结:
查看Thread类的run()方法的源代码,可以看到其实
这2种方式都是在调用Thread对象的run方法,如果Thread类的run方法没有被覆盖
且为该Thread对象设置了一个Runnable对象,该RUN方法会调用Runnable对象
的Run方法;
4.问题:
如果在Thread子类覆盖的run方法中编写运行代码,也为thread子类对象
传递了一个Runnable对象,那么,线程运行时的执行代码是子类的run方法的代码?
还是Runnable对象的run方法的代码?
源代码如下:TraditionalThread.java 包含上述知识点
package cn.hinge.yangjun;
public class TraditionalThread {
/**
*
* @param args
*/
public static void main(String[] args) {
Thread thread = new Thread(){
@Override
public void run() {
while(true){
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1:"+Thread.currentThread().getName());
System.out.println("2:"+this.getName());
}
}
};
//启动线程,测会调用run方法,但是,此方法没有业务逻辑,如果想用它来做某些事,侧需要子类重写此方法;
thread.start();
Thread thread2 = new Thread( new Runnable(){
public void run() {
while(true){
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2:"+Thread.currentThread().getName());
}
}
});
thread2.start();
/*
* new Thread( new Runnable() ).start() 拆分 成 new Thread( ){ run() }.start 和 new Thred(run()){} 前者是子类重写父类 Thread 类 run方法,后者是通过自己构造方法回调run方法
* 如下有2个run 方法.一个是子类,一个是父类,子类是重写父类Thread() run 方法,
而父类是在自己构造函数中通过 new Runable()方法 回写 run()方法
* 那么在程序运行是会执行那个 run 方法呢?
* 这个规则是这样的,程序首先执行子类中的run方法,如果子类没有。
就执行父类中run方法。但是只 执行一个。
*
*
*/
new Thread(new Runnable()//父类
{
public void run() {
while (true) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("runnable:"
+ Thread.currentThread().getName());
}
}
}) {
// thread 子类
public void run() {
while (true) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread:" + Thread.currentThread().getName());
}
}
}.start();
}
}
阅读(1455) | 评论(0) | 转发(0) |