package cn.dali3.code09;
/*从下面四种运行线程执行任务的方法可以看出,越来越简单,减少代码冗余
* 最后一种运用lambda表达式的方法体现了编程的函数思想。
*
* 函数编程思想:函数思想: 强调的是我们用什么东西去做什么事情,而不是用什么形式去做。
* 面向对象: 强调的是,做一件事,我们要找到一个能解决问题的对象,
* 过分强调了用对象的方法去做,而不是做什么事儿。
* lambda表达式语句的分析:
* 首先分析 Runnable接口的实现类,只需要重写一个run方法。
* public abstract void run();
* 无返回值,无参数,目的很明确,就是执行方法体。
* 格式:
* (参数列表)->{方法体}
* ():接口中抽象方法的参数列表
* ->:参数传递给后面的方法体
* {}:重写接口中的抽象方法
*
* 用这种方法,我们在启动新线程的时候,不许要对象,不需要实现类,直接利用接口实现其方法。
*
* 注意:在这个例子中,new Thread().start该方法会自动调用RunnableImpl1的run方法
* 所以该lambda表达式默认的方法就是run。
*
* 当我们使用自定义接口想使用lambda表达式的步骤:
* 1.创建一个方法,参数为该接口的实现类
* 2.在该方法中写入我们需要用的接口中的方法
* 3.在主方法中调用该方法使用lambda表达式
*
* 原理和这个例子是一样的,我们调用该方法,该方法的执行体就是执行接口中的方法,参数列表就是该接口的实现类
* new Thread(()->{执行体}).start();
* f1(()->{ 执行体})
* 比较:
* 1. Thread()需要用的是Runnable接口的实现类
* f1()需要用的是Cook接口的实现类
* 2. start()调用的是实现类的run方法
* f1()我们里面写的是调用他的eat方法
* */
import cn.dali3.code03.RunnableImpl;
public class Demo01 {
public static void main(String[] args) {
//第一种方法
RunnableImpl1 run = new RunnableImpl1();
Thread th = new Thread(run);
th.start();
//第二种方法
RunnableImpl1 run1 = new RunnableImpl1(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"正在执行");
}
};
Thread th1 = new Thread(run1);
th1.start();
//第三种方法
new Thread(new RunnableImpl1(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"正在执行");
}
}).start();
//lambda表达式方法
new Thread(()->{System.out.println(Thread.currentThread().getName()+"正在执行");}).start();
}
}
接口实现类:
package cn.dali3.code09;
public class RunnableImpl1 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"正在执行");
}
}