为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

泛舟湖上清波郎朗 2022-07-26 15:14:20
ThreadTest t = new ThreadTest();// ThreadTest已经实现了接口Runnablenew 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()函数 ,我不明白为什么?
查看完整描述

2 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

首先,启动另一个线程有2中方式:

  1. 实现runnable接口,然后通过Thread的构造函数把这个类传给Thread

  2. 直接继承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()的。


查看完整回答
反对 回复 2022-08-01
?
FFIVE

TA贡献1797条经验 获得超6个赞

因为t已经实现了接口Runnable,所以把t当做参数的时候,其实t已经调用了run方法,然后在传参给Thread(t)整体在调用start函数,运行程序。

查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信