Java学习day07--线程池-匿名函数-函数式接口
线程池-匿名函数-函数式接口
该部分主要讲解线程池的简单使用,主要掌握匿名函数的格式及应用场景,简化代码。最后利用匿名函数介绍函数式接口。
线程池的基本使用
- 使用意义
“线程池”的作用:一个线程执行完毕后,会立即成为“垃圾”,不能被重用。如果要重用,就要重新创建这个线程对象,
那么如果创建这个线程对象很耗时,就会降低程序的执行效率。
“线程池”就可以先“缓存”这些线程对象,并可以将“它们”反复的重用,这样就不需要每次都创建对象,可以提高程序
的运行效率。 - 线程池的类:
java.util.concurrent.ExecutorService(接口)
获取线程池对象:
ExecutorService service = Executors.newFixedThreadPool(2);
执行线程:
MyThread t = new MyThread();//创建线程对象
service.submit(t);//执行我们的线程对象
- 线程池的第三种构建方法
(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).传递一个子类对象;【最初】
2).传递一个匿名内部类对象;【简化了一点】
3).传递一个“Lambda表达式(就是一个方法-函数)”【又简化了一点】 -
前提条件
1).必须要是一个“接口”类型;
2).接口中必须:有,且只有一个“抽象方法”–函数式接口
还可以包含其他跟Object中方法声明一样的“抽象方法”
以上两个条件同时满足,才可以使用Lambda。 -
Lambda的标准格式:
() -> {}
1).一对小括号:():表示形参
2).一个右箭头:->:语法
3).一对大括号:{}:表示方法体 -
lambda的三种省略格式
三条省略规则:
1).形参:可以省略“数据类型名”;
2).形参:如果只有一个形参,可以同时省略:数据类型、一对小括号;
如果要省略小括号,就必须省略数据类型;
如果省略数据类型,可以不省略小括号;
3).方法体:如果方法体中只有一句话,可以同时省略:一对大括号,return关键字,语句后的分号。
函数式接口
- 定义
什么是“函数式接口”:有且只有一个(自己特有的)抽象方法的接口;
还可以包含:
1).其它的抽象方法:同Object类声明相同的抽象方法;
2).默认方法;
3).静态方法;
注解:@FunctionalInterface可以用于“函数式接口的定义”
- 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);
}
}
- Consumer接口(消费者接口)
- Function接口(函数接口)
- Predicate接口(判断接口)