A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/*
原本按照我的思路:
1 利用实现方式创建线程时,Thread类接收了一个Runnable对象r,启动线程后就会调用Runnable对象的run方法。
2 MyThread继承了Thread类的构造方法,就继承了其功能,也包括上面的功能。
3 所以MyThread类在接收Runnable对象创建新的线程时,会执行Runnable对象的run方法
看结果:
*/

public class ThreadTest {
        public static void main(String[] args){
                new MyThread(new MyRunnable()).start();
        }
}

class MyRunnable implements Runnable{
        public void run(){
                System.out.println("This is the method run() in MyRunnable.");
        }
}

class MyThread extends Thread{
        MyThread(Runnable r){
                super(r);
        }
        public void run(){
                System.out.println("This is the method run() in MyThread.");
        }
}

/*
Console:
This is the method run() in MyThread

寻找原因:(查看API)
API中Runnable接口中的run()方法描述如:
使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。
单解读这句话,上面的思路是没有错的。
再看Thread类的run()方法:
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
Thread 的子类应该重写该方法。
原来Thread类中的run()方法不是空的!起码有个判断语句。2中描述的功能决定于所调用的构造方法,却依赖于Thread类的run()方法。MyThread类中重写run()方法时,没有把父类run()方法中的优秀基因给继承过来。所以会运行Thread类中的run()方法。

*/

评分

参与人数 1技术分 +2 收起 理由
岳民喜 + 2

查看全部评分

2 个回复

倒序浏览
哦,是这样的啊,学到知识了,{:soso_e100:}。
回复 使用道具 举报
继续:

/*又查阅了资料:Thread类中有个Runnable类型的属性,名字叫target,而Thread类的run()方法用到了这个属性。run()方法的代码为:
public void run(){
        if(target != null){
                target.run();
        }
}*/

public class ThreadTest {
        public static void main(String[] args){
                new MyThread(new MyRunnable()).start();
        }
}

class MyRunnable implements Runnable{
        public void run(){
                System.out.println("This is the method run() in MyRunnable.");
        }
}

/*class MyThread extends Thread{
        MyThread(Runnable r){
                super(r);
        }
        public void run(){
                System.out.println("This is the method run() in MyThread.");
        }
}*/
/*Console:
This is the method run() in MyThread.*/

//还原run()方法
class MyThread extends Thread{
        private Runnable target;
        MyThread(Runnable r){
                super(r);
                this.target = r;
        }
        public void run(){
                if(this.target != null){
                        target.run();
                }
        }
}

/*Console:
This is the method run() in MyRunnable.*/
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马