package com.CUPK.lsz;
public class TraditionalThread {
public static void main(String[] args) {
/*
* 方法一:
*/
// 定义一个子类对象
Thread thread0 = new Thread() {
public void run() {
while (true) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("0当前线程为:" + Thread.currentThread().getName());
System.out.println("1当前线程为:" + this.getName());
}
}
};
// thread0.start();
/* 方法二 */
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
// TODO Auto-generated method stub
System.out.println("当前线程为:" + Thread.currentThread().getName());
}
}
});
// thread1.start();
/* 深入理解run()方法 */
//首先start()方法去找当前对象Thread,并执行当前对象的run()方法,如果没找到子类的run()方法,才会去找父类的run()方法,在Runnable对象不为null时,父类run()方法会去找Runnable的run()方法,而当前子类有run()方法,所以会执行子类的run()方法
//建立Thread类的子对象,并重run()方法,这个时候子类的run()方法已经重写了父类的run()方法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Runnable run" + Thread.currentThread().getName());
}
}) {
@Override
public void run() {
while (true) {
System.out.println("Thread run" + Thread.currentThread().getName());
}
}
}.start();
}
}
//如果我们将Thread类的子对象中的run()方法去掉,则会调用父类run()方法,有因为Runnable对象不为null,所以进而调用Runnable的run()方法
这里我们重点说一下方法二 :
首先我们看一下Thread类的源代码:
由上面图片可以看出1、在Thread类中定义了Runnable类的target对象
2、在Thread的构造方法public Thread(Runnable target)中调用了init()方法
3.private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc) 方法中
this.target=target语句将类中的target对象赋值
4.类中的run(){}方法有如下语句:if(targit!=null){target.run();}说明如果类中的target对象不为null,则调用target对象的run()方法,
所以我们将Runnable类创建的target子对象传给Thread()类,并在其中实现target子对象的run()方法。