java学习笔记12-线程池 及lambda表达式

线程间通信:多个线程在处理同一个资源,但是处理的动作不同

等待唤醒机制:就是多个线程之间的一种协作机制.即一个线程进行了规定操作后就进入等待状态,等待其他线程执行完他们指定的代码后再将其唤醒. wait\notify就是一种多线程之间的协作机制

等待唤醒机制就是用于解决线程间通信问题的

调用wait和notify方法锁需要注意的细节
1.wait和notify必须由同一个锁对象调用 2.wait和notify方法是Object类的方法 3.wait和notify方法必须在同步代码块或同步方法中调用

等待唤醒机制其实就是经典的生产者和消费者的问题

我们使用一个线程的时候就去创建一个线程,这样实现起来非常简单,但是当并发的线程数量很多,而且每个线程执行很短时间的任务就结束了,这样频发创建线程会大大降低系统的效率(线程频繁的创建和销毁都需要时间),为了复用线程,就有了线程池.

线程池其实就是一个可以容纳多个线程的容器,其中的线程可以反复使用,避免了频繁创建线程的操作而带来的系统资源消耗

合理利用线程池带来三个好处: 1.降低了资源的消耗 2.提高了响应速度 3.提高了线程的可管理性 每个线程大约需要1MB的内存

java里面线程池的顶级接口是 java.util.concurrent.Executor 但严格意义上Executor并不是一个线程池,而是一个执行线程的工具.真正的线程池是java.util.concurrent.ExecutorServer
java.util.concurrent.Executors线程池工厂类里面提供了一些静态方法,用于生成常用的线程池.官方建议使用Executors线程池工厂类来创建线程池对象
Executors.newFixedThreadPool(int nThreads) 创建有界线程池对象(ExecutorServer) 即线程池对象中线程的个数可以指定最大数量
线程池有一个提交任务的方法 public Future<?> submit(Runnable task); 获取线程池中某一个线程对象并执行 Future接口用来记录线程任务执行完毕后产生的结果
使用线程池中线程对象的步骤:1.创建一个线程池对象 2.创建一个线程任务对象(Runnable接口的子类对象)3.调用线程池对象submit方法,提交线程任务 4.关闭线程池(一般不做)

线程池底层是LinkedList增删块,从头删除,从尾添加

函数式编程强调做什么而不是以什么形式做.
面向对象的思想:做一件事情,首先找一个可以做这件事情的对象,然后调用对象的方法去执行
函数式编程思想:只要能获取到结果,谁去做的,怎么做的都不重要,重要的是结果而不是过程

冗余的Runnable代码,经过分析,似乎只有方法体是关键所在.传递一段代码这才是我们正真的目的,而创建对象是我们受限于面向对象语法而不得不采取的一种手段方式

jdk1.8中加入了lambda新特性

匿名内部类的好处和弊端 好处:它可以帮我们省去实现类的定义 弊端:它的代码语法太复杂了

() -> System.out.println(“这是一个多线程代码”) 其中()代表run方法的参数,未传递参数 ->代表将前面的参数传递给后面的代码 右面代表业务逻辑代码

lambda表达式的标准格式是 (参数类型 参数) -> { 代码语句 }

lambda省略格式,凡是可推导的内容皆可省略 invokeCal(120,130,(a,b)->a+b) 代替invokeCal(120,130,(int a,int b)->{return a+b;});

lambda的省略规则 1.小括号内参数的类型可以省略 2.若果小括号内有且只有一个参数,则小括号可以省略 3.如果大括号内有且仅有一个语句,则无论是否有返回值,大括号\return;都可以省略

使用lambda注意事项: 1.必须具有接口,且接口中有且仅有一个抽象方法 2.具有上下文推断,即方法的参数或局部变量类型必须是lambda对应的接口类型

有且仅有一个抽象方法的接口被称为"函数式接口"

猜你喜欢

转载自blog.csdn.net/wwzzh1989/article/details/89208910