当我们重写Thread类中的run方法时,经常会看到这样的代码:
public void run() {
super.run();
System.out.println(Thread.currentThread().getName());
}
这个super() 到底有什么用呢?先看一下 Thread 类中的实现:
private Runnable target;
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
@Override
public void run() {
if (target != null) {
target.run();
}
}
从上图我们可以分析出,利用Thread类中的构造函数,我们可以自己实现Runnable接口,使用 Thread(Runnable target)构造函数重写run()方法,来实现我们需要的功能。那么,将这个super() 写入我们自己的MyThread又有什么作用呢?
public class MyThread extends Thread {
MyThread(Runnable runnable) {
super(runnable);
}
public void run() {
super.run();
System.out.println(Thread.currentThread().getName());
}
}
我们给自己实现的MyThread类中加入可接受runnable的构造函数,并实现Runnable接口打印当前线程(与MyThread的打印一致),进行代码测试:
public class MyThreadTest {
public static void main(String[] args ) {
Runnable runnable = new MyRunnable();
MyThread myThread = new MyThread(runnable);
myThread.start();
System.out.println(Thread.currentThread().getName());
}
}
测试结果如下:
main
Thread-0
Thread-0
可见,MyRunnable 中的 run() 和 MyThread 类中的 run()处于同一线程,两个函数均会执行。