new Thread(new Main(), "a").start();
new Thread(new Main(), "b").start();
上面的代码跟下面的代码有没有区别?有什么区别呢?
Main a=new Main("A");
Main b=new Main("b");
a.start();
b.start();
new Thread(new Main(), "a").start();
new Thread(new Main(), "b").start();
上面的代码跟下面的代码有没有区别?有什么区别呢?
Main a=new Main("A");
Main b=new Main("b");
a.start();
b.start();
public class Main extends Thread{
public void run(){
}
public static void main(String[] args){
new Main().start();
Thread t = new Main();
t.start();
}
}
对应的字节码如下
0: new #2 // class Main
3: dup
4: invokespecial #3 // Method "<init>":()V
7: invokevirtual #4 // Method start:()V
10: new #2 // class Main
13: dup
14: invokespecial #3 // Method "<init>":()V
17: astore_1
18: aload_1
19: invokevirtual #5 // Method java/lang/Thread.start:()V
22: return
区别在于第二种情况下,需要一个变量来存放new出来对象的引用,而第二种情况直接在栈上就调用了,少了第17和第18行两步处理。
12 回答5.7k 阅读
2 回答3.2k 阅读✓ 已解决
3 回答6.9k 阅读✓ 已解决
3 回答3k 阅读✓ 已解决
5 回答4.6k 阅读
4 回答2.2k 阅读
3 回答4.2k 阅读
个人理解:
1.你只需要问:
这两种创建线程方式的区别即可,这样更能体现问题本质,所以不需要那一个a和b出来。我感觉这是提问题的一个原则,和单元测试一样,想做什么就直奔主题,不要添加一些无关的东西出来扰乱视线。
2.第一个代码中Main是一个Runnable接口的实现,第二个Main是一个Thread类的扩展,这是Java中实现线程的两种不同方式,所以这个问题可以抽象为:在Java中,这两种不同的线程实现方式有何区别?
3.本人理解的这两种实现方式的区别是:使用实现Runable接口的方式
a)可以继承其他类,而使用继承Thread类的方式,就无法继承其他类了(java只能单继承)。
b)更重要的是,可以实现线程间资源的共享。