liangzj9624 2019-05-02 00:22 采纳率: 0%
浏览 15111

Java8中直接new对象和用 类名::new 创建对象这两种形式有什么区别吗?

为什么在线程中用 类名::new 创建Runable对象后对象的run方法好像没有被执行,线程3和4没有输出内容(PrintThreadName就是输出当前线程名称的)

    public static void main(String[] args) {
        new Thread(new PrintThreadName(), "1").start();
        new Thread(new PrintThreadName(), "2").start();
        new Thread(PrintThreadName::new, "3").start();
        new Thread(PrintThreadName::new, "4").start();
    }
  • 写回答

3条回答 默认 最新

  • 淡定的人O 2019-05-02 07:22
    关注

    PrintThreadName::new是lambda表达式
    表示用PrintThreadName构造方法代替new Thread(new Runable(){run(){}})的run方法。
    所以线程3和4没有输出内容,但是你在构造方法里面打印,就会有输出,
    要想有你要的效果你可以
    PrintThreadName objectc=new PrintThreadName();
    new Thread(objectc::run, "4").start();

    介绍一下这种表达式:
    A::B B代表方法,如果B是静态或构造,A必须是类名。如果B是实例方法造,A必须是对象。
    同时上面new Thread()参数需要的是实现接口的对象,接口只有一个方法,所以可以用lambda表达式,要保证这唯一的方法与替代的他的
    方法参数一样。显然::这种只能用于无参。除了用::,还能用()->{ },()与方法的()一样,这里表示无参,有参这样(s)->{}
    即:new Thread(()->{ }, "4").start();

    评论
  • 关注

    大佬牛逼

    评论
  • m0_61972898 2021-09-16 08:21
    关注

    构造函数也不会打印呀

    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部