返回目录
首先回顾一下多线程的实现方式,两种:Thread、Runnable。
Thread方式:
new Thread() {
@Override
public void run() {
//TODO 线程逻辑
System.out.println("");
}
}.start();
Runnable方式:
new Thread(new Runnable() {
@Override
public void run() {
//TODO 线程逻辑
System.out.println("");
}
}).start();
问题:下面代码打印结果是?
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("runnable");
}
}){
@Override
public void run() {
System.out.println("thread");
}
}.start();
答案:thread
分析:查看Thread类源码如下
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
private void init(ThreadGroup g, Runnable target, String name,
long stackSize) {
init(g, target, name, stackSize, null);
}
private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc) {
/* 部分省略 */
this.target = target;
/* 部分省略 */
}
@Override
public void run() {
if (target != null) {
target.run();
}
}
通过Thread的run方法源码可以看出(这里的target就是我们传入的Runnable对象),Runnable对象的run方法是通过Thread类的run方法来执行的。在这个问题中,虽然传入了Runnable对象,但是同时也重写了Thread的run方法,所以Runnable对象的run方法将不被执行,最后打印结果即为thread。
对比:
使用Runnable方式优于Thread方式,原因如下:
- 能够避免单继承带来的局限性
- 多个线程可以服用同一个Runnable对象,使得线程之间能够共享数据
- 更好的体现了面向对象的设计思想
下一篇:定时器




评论