java 多线程启动问题
伊谢尔伦
伊谢尔伦 2017-04-17 12:00:59
[Java讨论组]
 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();
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
黄舟

个人理解:
1.你只需要问:

new Thread(new Main()).start();
和
new Main().start();

这两种创建线程方式的区别即可,这样更能体现问题本质,所以不需要那一个a和b出来。我感觉这是提问题的一个原则,和单元测试一样,想做什么就直奔主题,不要添加一些无关的东西出来扰乱视线。

2.第一个代码中Main是一个Runnable接口的实现,第二个Main是一个Thread类的扩展,这是Java中实现线程的两种不同方式,所以这个问题可以抽象为:在Java中,这两种不同的线程实现方式有何区别?

3.本人理解的这两种实现方式的区别是:使用实现Runable接口的方式
a)可以继承其他类,而使用继承Thread类的方式,就无法继承其他类了(java只能单继承)。
b)更重要的是,可以实现线程间资源的共享。

大家讲道理
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行两步处理。

黄舟

runnable中run,只是一个对象的方法。并没有创建新的线程。如果要创建新的线程,一定要new thread。然后通过start来执行run方法

阿神

貌似没有,这就是多肽的表现而已

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号