背景
当要执行新的线程任务时,我们就去创造一个线程,这样使用起来很方便
但存在的问题是,当频繁创建了很多线程,每个线程执行完就销毁了,开销很大,因为创建和销毁线程需要时间
使用一种方法线程池,使线程得以复用:线程执行完任务后,不销毁,可以继续执行下一个任务。
线程池
线程池中存放多个新建的线程,需要执行线程任务时,就往线程池中添加线程任务。
如果加入的线程任务数目超过线程池并发的线程数时,剩余的线程任务会先进入等待队列,直到线程池有线程空闲,再来执行这些剩余的任务。
使用
- 使用线程池的工厂类Executors的静态方法newFixedThreadPool(int nthread) 设置一个指定线程数的线程池,会返回一个ExecutorService线程池接口
- 使用Runnable 创建需要的线程任务1、2、3。。。。。
- 调用ExecutorService对象的submit(Runnable a)方法,往线程池中添加线程任务,线程任务便开始执行。
RejectedExecutorException出现的原因:一种是新加入线程时,线程池已经被销毁了
一种是线程数量已经超过线程池的最大容量
函数式编程思想:
只关注结果,不管是谁去做的,怎么做的,不重视过程
面向对象编程思想:
做一个事情,找一个对象,调用这个对象的方法,去解决事情
Lambda表达式
使用函数编程的思想,简化冗余的代码
使用前提
- 接口中有且只有一个抽象方法
- Lambda必须具有上下文判断(可推断即可省略),方法的参数或局部变量的类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
有且只有一个抽象方法的接口叫做“函数式接口”
标准格式
包含三部分: 参数、箭头、代码 ( 参数列表 ) -> { 重写方法的代码 }
//除了有效语句,其它的冗余可以删除
new Thread(new Runnable(){
public void run(){
有效语句.......
}
}).start();
//标准格式
new Thread(() -> {
有效语句.......
}
}).start();
省略格式
- 参数列表中参数的数据类型可以省略
- 参数列表中如果只有一个参数,甚至括号也可以不写
- 有效内容如果只有一句话,那么其大括号、返回值、分号都可以省略,并且要么一起省略,要么三个都不要省略