请教一个“java多线程runnable匿名传入线程的问题”
网上一个学习资料中有下面的程序:newThread(newRunnable(){//匿名publicvoidrun(){System.out.println("runna...
网上一个学习资料中 有下面的 程序:
new Thread(new Runnable(){ //匿名
public void run(){
System.out.println("runnable run");
}
})
{
public void run(){
System.out.println("subthread run");
}
}.start(); //结果:subthread run
结果为啥 不是 "runnable run"?
个人小白,请高手赐教,多谢!
(是因为 Thread中的run方法 重写了 Runnable中的 run方法吗?) 展开
new Thread(new Runnable(){ //匿名
public void run(){
System.out.println("runnable run");
}
})
{
public void run(){
System.out.println("subthread run");
}
}.start(); //结果:subthread run
结果为啥 不是 "runnable run"?
个人小白,请高手赐教,多谢!
(是因为 Thread中的run方法 重写了 Runnable中的 run方法吗?) 展开
1个回答
展开全部
一点一点分析:
把代码拆成4部分,
1. new Thread()声明一个对象,这里用了匿名类的方式,后面有具体实现
2 声明匿名类实现
{
public void run(){
System.out.println("subthread run");
}
}
3 然后看这匿名对象的构造参数,
new Runnable(){ //匿名
public void run(){
System.out.println("runnable run");
}
}
4 已经拿到了匿名Thread的引用,调用start()方法
实际上就是一个匿名对象Thread,传入了一个匿名对象Runnable作为构造参数。
对比一下正常的线程创建方式:
第一种: class test implements Runnable(){
@override
public void run(){
...
}
}
...main(){
Thread thread = new Thread(new test());
thread.start();
}
第二种:再看用Thread的方式
class test2 extends Thread(){
@override
public void run(){
....
}
}
也就是说:
你贴的代码就是第一种方式,只不过用了匿名的方式,
然后创建thread对象的时候
如果构造方法传入了runable、callable接口的参数,那就运行传入的参数
而不再运行自己的run方法。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询