第一种线程的初始化
//第一种 线程的初始化
Thread a = new Thread(){
public void run() {//此方法为子类覆盖Thread父类的run方法
while(true){
System.out.println("1:"+Thread.currentThread().getName());
}
}
};
a.start();
第二种线程的初始化
//第二种线程的初始化
Thread b = new Thread(new Runnable() {
//此方法为子类覆盖父类的public Thread(Runnable target)中的target.run()方法
@Override
public void run() {
while(true){
System.out.println("2:"+Thread.currentThread().getName());
}
}
});
b.start();
两种方式的区别
第一种是重写了Thread类的run方法(在jdk下的java.lang.Thread的run方法如下)
@Override
public void run() {
if (target != null) {//此处的target为Thread(Runnable target)里面的target
target.run();
}
}
也就是说第一种是覆盖了上面的run方法
第二种是实现了java.lang.Runnable并且重写了java.lang.Runnable下的run方法(也就是上图的target.run())。
深入理解
一般来说调用Thread的start()方法会先看是否重写了Thread的run方法
重写则调用其子类的run方法
未被重写则调用其父类的run方法即执行重写了java.lang.Runnable下的run方法
看如下问题
//会执行那段代码????
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
System.out.println("3:"+Thread.currentThread().getName());
}
}
}){
public void run() {//此方法为子类覆盖父类的run方法
while(true){
System.out.println("4:"+Thread.currentThread().getName());
}
}
}.start();
答案是会执行下面一个run方法。因为匿名Thread类重写了父类的run方法则会执行第二个run方法语句。
若想执行第一个run方法则只需将第二个run方法的去掉即可。