Java学习day07--线程池-匿名函数-函数式接口

本文深入解析Java线程池的基本使用及其优势,通过实例展示如何利用Lambda表达式简化线程操作,同时介绍了Callable接口实现线程的另一种方式,以及函数式接口、Supplier、Consumer和Function接口的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程池-匿名函数-函数式接口

该部分主要讲解线程池的简单使用,主要掌握匿名函数的格式及应用场景,简化代码。最后利用匿名函数介绍函数式接口。

线程池的基本使用

  1. 使用意义
    “线程池”的作用:一个线程执行完毕后,会立即成为“垃圾”,不能被重用。如果要重用,就要重新创建这个线程对象,
    那么如果创建这个线程对象很耗时,就会降低程序的执行效率。
    “线程池”就可以先“缓存”这些线程对象,并可以将“它们”反复的重用,这样就不需要每次都创建对象,可以提高程序
    的运行效率。
  2. 线程池的类:java.util.concurrent.ExecutorService(接口)
    获取线程池对象:
ExecutorService service = Executors.newFixedThreadPool(2);

执行线程:

	MyThread t = new MyThread();//创建线程对象
	service.submit(t);//执行我们的线程对象
  1. 线程池的第三种构建方法
    (1).回顾之前实现线程的两种方式:
    1).继承Thread;
    2).实现Runnable接口
    (2).之前的这两种方式有一个缺陷:都不能返回值,而且run()不能抛出“编译期异常”
    (3).从JDK5开始,JAVA提供了第三种实现线程的方式:
    3).实现Callable接口
    (4).示例代码:
    1).自定义类实现Callable接口,重写:call()方法;
public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        //计算1--100的累加和
        int sum = 0;
        for (int i = 1 ; i <= 100 ; i++) {
            sum += i;
        }
        return sum;
    }
}
	2).启动线程:注意:必须使用“线程池”启动:
public class Demo {
    public static void main(String[] args) 
				throws ExecutionException, InterruptedException {
        //1.创建一个线程对象
        ExecutorService service = Executors.newFixedThreadPool(2);
        //2.创建自定义对象
        MyCallable myCall = new MyCallable();
        //3.调用线程池对象的submit()执行线程
        Future<Integer> result = service.submit(myCall);
        //4.调用Future的get()方法获取结果
        System.out.println("将要获取结果.....");
        Integer intObj = result.get();
        System.out.println("结果是:" + intObj);
    }
}

lambda表达式

  1. 可传递给形参的三种方式
    1).传递一个子类对象;【最初】
    2).传递一个匿名内部类对象;【简化了一点】
    3).传递一个“Lambda表达式(就是一个方法-函数)”【又简化了一点】

  2. 前提条件
    1).必须要是一个“接口”类型;
    2).接口中必须:有,且只有一个“抽象方法”–函数式接口
    还可以包含其他跟Object中方法声明一样的“抽象方法”
    以上两个条件同时满足,才可以使用Lambda。

  3. Lambda的标准格式:
    () -> {}
    1).一对小括号:():表示形参
    2).一个右箭头:->:语法
    3).一对大括号:{}:表示方法体

  4. lambda的三种省略格式
    三条省略规则:
    1).形参:可以省略“数据类型名”;
    2).形参:如果只有一个形参,可以同时省略:数据类型、一对小括号;
    如果要省略小括号,就必须省略数据类型;
    如果省略数据类型,可以不省略小括号;
    3).方法体:如果方法体中只有一句话,可以同时省略:一对大括号,return关键字,语句后的分号。

函数式接口

  1. 定义
    什么是“函数式接口”:有且只有一个(自己特有的)抽象方法的接口
    还可以包含:
    1).其它的抽象方法:同Object类声明相同的抽象方法;
    2).默认方法;
    3).静态方法;

注解:@FunctionalInterface可以用于“函数式接口的定义”

  1. Supplier接口(生产者接口)
    抽象方法原型:T get(),改写代码如下:

public class Demo {
    public static void main(String[] args) {
        fun(()-> System.out.println("线程启动...."));
	  //使用匿名内部类
        fun2(new Supplier<String>() {
            @Override
            public String get() {
                return "呵呵";
            }
        });
        //Lambda的完整格式
        fun2(()->{return "呵呵";});
        //Lambda的省略格式--方法体
        fun2(()->"呵呵");

    }
    public static void fun(Runnable run){
        new Thread(run).start();
    }

    public static void fun2(Supplier<String> sp){
        String s = sp.get();
        System.out.println("返回的是:" + s);
    }
}

  1. Consumer接口(消费者接口)
  2. Function接口(函数接口)
  3. Predicate接口(判断接口)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值