1.1 在方法中传入行为参数快速入门

1、传统java多线程的创建方式

 Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("传统的多线程的方法执行了");
            }
        });
        thread1.start();

2.在方法中传入行为的方式创建多线程

 Thread thread2= new Thread(() -> System.out.println("行为参数化方法执行了"));
        thread2.start();

3.两种方式对比

1)没有引入与行为无关的代码,第2中方式在代码更加直观、优雅。

2)第1中方式,在编译阶段会多参生一个class文件

4.第二种方法为什么可以执行

从Thread的构造方法(public Thread(Runnable target))来看,只要往构造方法中传入一个Runnable的接口的子类就可以了。但是第二中方法并没有传入Runable的子类,它又是如何执行的?

这里就涉及到java编译器的类型推断了,当一个参数的类型是一个函数式接口(就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口)的时候,只要传入的行为或者说方法的签名,符合函数式接口中唯一的抽象方法的签名的时候,编译器就可以自动将它作为第一种方法使用,当然本质还是不一样的,从理解角度可以这么认为。

“() -> System.out.println("行为参数化方法执行了")”这个表达式后面会有详解,暂时的话,你可以把()当作方法中(),->后面的内容就是方法体了。这不是和Runable接口中抽象方法(public abstract void run())的签名一致了吗!所以编译可以自动完成类型的推断。

总结:如果你想在一个方法中传入一个行为参数,那么这个行为必须封装在函数式接口中,否则的话,你还只能通过匿名内容类的方式去将行为参数化

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页