我不明白为什么代码会调用Runnable接口子类对象t中的run()函数?

ThreadTest t = new ThreadTest();// ThreadTest已经实现了接口Runnable
new Thread(t).start();
请问new Thread(t).start();这句代码为什么会调用Runnable接口子类对象t中的run()函数?我的理解是因为首先new Thread(t)是先定义了一个Thread线程类的匿名对象,然后这个匿名对象去调用start()函数,为什么这个strat()函数不是启用Thread匿名对象中的run()函数,Thread匿名对象中不是也有run()函数吗?而却调用了Runnable接口子类对象t中的run()函数?虽然t通过构造函数初始化传递给Thread的匿名对象,但这有什么关系吗?
上面已经提到 TestThread已经实现了Runnable接口 并且重写了run()函数,所以肯定是通过public Thread (Runnable target)方式也就是Runnable方式实现多线程,最主要的是我的程序new Thread(t).start()( 也就是这段代码)最终调用的是TestThread中重写的run()函数,不是Thread自己的run()函数 ,我不明白为什么?

泛舟湖上清波郎朗
浏览 169回答 2
2回答

慕的地10843

首先,启动另一个线程有2中方式:实现runnable接口,然后通过Thread的构造函数把这个类传给Thread直接继承Thread,重写run方法。实际启动线程的时候都是条用的Thread的run()方法1,将自己已经实现Runnable接口的类传给Thread,那么在调用Thread的run的时候,就会调用你传入的Runnale的run()方法2,因为你没有传run,所以会调用你自己重写的Thread的run()方法方法1与方法2最大的区别,可能就是方法1采用实现接口的方式,方法2采用继承的方法。因为java不能多继承,所以采用方法2以后,就不能再继承其他类。所以一般推荐使用方法1.为什么这个strat()函数不是启用Thread匿名对象中的run()函数,Thread匿名对象中不是也有run()函数吗?其实这个start()就是启用Thread自己的run,请看Thread的源代码: public void run() {    if (target != null) {        target.run();    }    }这里的target就是你构造Thread的时候传进来的Runnable对象。所以如果你构造Thread的时候传了一个Runnable,最终start()是会调用该Runnable的run()的。

FFIVE

因为t已经实现了接口Runnable,所以把t当做参数的时候,其实t已经调用了run方法,然后在传参给Thread(t)整体在调用start函数,运行程序。
打开App,查看更多内容
随时随地看视频慕课网APP