探索2种创建多线程方法本质

lliiqiang 2014-10-21 11:03:32
下面代码的运行结果是什么:

package com;

public class start {

/**
* @param args
*/
public static void main(String[] args) {
new threads(new Run()).start();
}



}

class Run implements Runnable{

@Override
public void run() {
System.out.println("runnable");
}

}

class threads extends Thread{

public threads(Run run){
super(run);
}

public void run(){
System.out.println("thread");
}
}
...全文
135 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Paul_ZJ 2014-10-21
  • 打赏
  • 举报
回复
实际试了一下这个程序,,输出居然是thread,感觉很神奇。。 首先看看Thread类里面run函数的的说明 /** * If this thread was constructed using a separate * <code>Runnable</code> run object, then that * <code>Runnable</code> object's <code>run</code> method is called; * otherwise, this method does nothing and returns. * <p> * Subclasses of <code>Thread</code> should override this method. * * @see #start() * @see #stop() * @see #Thread(ThreadGroup, Runnable, String) */ @Override public void run() { if (target != null) { target.run(); } } API文档李米娜说,有target,执行target的润函数;没有target,do nothing!! 按上面的程序,new threads(new Run()),,target应该是Run的一个实例,但是为什么没有执行Run类里面的run函数呢?? 后来一想,调用层次是这样的:Thread绑定target之后,先调用Thread的run函数,在这个run函数里面调用target的run函数。 现在,class threads extends Thread,定义了一个继承Thread的类,问题是还会不会调用Thread的run函数?? 明显不会,因为子类已经重写了父类的run函数 修改程序如下: package com.test; public class Test { /** * @param args */ public static void main(String[] args) { new threads(new Run()).start(); } } class Run implements Runnable{ @Override public void run() { System.out.println("runnable"); } } class threads extends Thread{ public threads(Run run){ super(run); } public void run(){ System.out.println("thread"); super.run(); //此处调用Thread的run函数 } } 输出结果: thread runnable
windsunmoon 2014-10-21
  • 打赏
  • 举报
回复
就是考对多态的理解罢了。
lliiqiang 2014-10-21
  • 打赏
  • 举报
回复
引用 1 楼 shuitawuhen 的回复:
实际试了一下这个程序,,输出居然是thread,感觉很神奇。。 首先看看Thread类里面run函数的的说明 /** * If this thread was constructed using a separate * <code>Runnable</code> run object, then that * <code>Runnable</code> object's <code>run</code> method is called; * otherwise, this method does nothing and returns. * <p> * Subclasses of <code>Thread</code> should override this method. * * @see #start() * @see #stop() * @see #Thread(ThreadGroup, Runnable, String) */ @Override public void run() { if (target != null) { target.run(); } } API文档李米娜说,有target,执行target的润函数;没有target,do nothing!! 按上面的程序,new threads(new Run()),,target应该是Run的一个实例,但是为什么没有执行Run类里面的run函数呢?? 后来一想,调用层次是这样的:Thread绑定target之后,先调用Thread的run函数,在这个run函数里面调用target的run函数。 现在,class threads extends Thread,定义了一个继承Thread的类,问题是还会不会调用Thread的run函数?? 明显不会,因为子类已经重写了父类的run函数 修改程序如下: package com.test; public class Test { /** * @param args */ public static void main(String[] args) { new threads(new Run()).start(); } } class Run implements Runnable{ @Override public void run() { System.out.println("runnable"); } } class threads extends Thread{ public threads(Run run){ super(run); } public void run(){ System.out.println("thread"); super.run(); //此处调用Thread的run函数 } } 输出结果: thread runnable
这个题目证明了所谓的用Runnable创建线程对象其实是利用系统默认的Thread类的run实现方式:调用Runnable方法,而继承Thread类方法是利用自定义的run方法实现的.其本质都是Thread类的run方法.

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧