返回目录
首先回顾一下多线程的实现方式,两种: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对象,使得线程之间能够共享数据
- 更好的体现了面向对象的设计思想
下一篇:定时器
评论
你肿么看?