黑马程序员技术交流社区
标题:
又是线程问题
[打印本页]
作者:
job
时间:
2014-4-25 22:56
标题:
又是线程问题
本帖最后由 job 于 2014-4-26 19:32 编辑
class ThreadTest
{
public static void main(String[] args)
{
new Thread(new Runnable()
{
public void run()
{
System.out.println("runnable run");
}
})
{
public void run()
{
System.out.println("subThread run");
}
}.start();
复制代码
当时,稍微明白点,现在回过头来再看又想不通了,结果是subthread.run,求高手指点!
作者:
skill20
时间:
2014-4-25 23:14
class ThreadTest
{
public static void main(String[] args)
{
new Thread(new Runnable()//这里一个匿名内部类实现的是Runnable接口,
{
public void run()
{
System.out.println("runnable run");
}
})
{
public void run()
{
System.out.println("subThread run");//这个是Thread的匿名内部类,用的是它的start
}
}.start();
复制代码
作者:
WO.瘾姓埋銘
时间:
2014-4-25 23:27
private Runnable target;
public void run() {
if (target != null) {
target.run();
}
}
以上是java Thread类的元代码
你将Runnable接口传入Thread类中,是将Runnable接口传给target属性,然后在运行时Thread的run方法去找target属性的run方法.
你这段代码最后将Thread类中的run方法重写了,就是说Thread的run方法中只有你写的{
16. System.out.println("subThread run");
17. }
也就无法去找target属性的run方法了
作者:
job
时间:
2014-4-25 23:30
WO.瘾姓埋銘 发表于 2014-4-25 23:27
private Runnable target;
public void run() {
if (target != null) {
这个解释太给力了!
作者:
土突突
时间:
2014-4-26 02:15
本帖最后由 土突突 于 2014-4-26 11:55 编辑
可以简单分析下你的代码:
new Thread(new Runnable()
{
public void run()
{
System.out.println("runnable run");
}
}) /*以括号结束,相当于new Thread(t) 其中t是实现了Ruannable接口的匿名类对象并重写了Thread的run方法。如在此调用start()就会打印runnable run*/
复制代码
{/*紧跟一对大括号,相当于定义了一个继承Thread类的匿名类对象,并再次重写了Thread的run方法*/
public void run()
{
System.out.println("subThread run");
}
}.start(); /*调用start() 方法就会调用该匿名类对象的run方法,既第二个run方法,该匿名类是通过基类的Thread(Runnable target)构造函数类进行继承的*/
复制代码
作者:
微笑=.一瞬间
时间:
2014-4-26 11:53
那个下面的大括号里面的内容相当于 匿名子类吧好像 你覆盖了上面写的实现Runnable类的run方法所以执行的run方法是下面大括号里面的run方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2