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中方式:
实现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
TA贡献1797条经验 获得超6个赞
因为t已经实现了接口Runnable,所以把t当做参数的时候,其实t已经调用了run方法,然后在传参给Thread(t)整体在调用start函数,运行程序。
添加回答
举报
0/150
提交
取消