1、 线程池

   就好生活中的游泳池,可以容纳多人在池子里游泳、戏水。线程池里可以有多个正在运行的线程,同时执行已经提交了的多个任务。

      

  什么是线程池?一个用来创建和管理线程的容器。

          

  • 线程池的原理

    线程复用

  • 线程池好处

    1、降低了资源的消耗,避免了频繁创建和销毁线程带来的系统开销

    2、提高了响应速度

    3、可以更好的管理线程的数量

       1.1 线程池的使用:提交了Runnable任务

    1.1.1 如何获得线程池

通过该类的静态方法可以创建线程池对象,该方法如下:

public static ExecutorService newFixedThreadPool​(int nThreads)  //创建线程池对象并制定线程数量

    参数 ExecutorService: 该接口的实现类对象就是一个线程池对象   

    ExecutorService常用方法:

      Future<?> submit​(Runnable task)   

提交一个可运行的任务执行,并返回一个表示该任务的Future。

   1.1.2 销毁线程池

     void shutdown​()  //销毁线程池,会等待线程池中所有的任务执行完毕之后再销毁

      shutdownNow​()  //立即销毁线程池,如果还没有开始执行的任务就不会执行

 

  1.2 线程池的使用:提交了Runnable任务

  • 通过工具类ExecutorService调用静态方法:newFixedThreadPool创建线程池对象并制定线程的数量。

  • 创建一个类实现Runnable接口,重写run方法,将线程任务相关的代码写在run方法中

  • 调用线程池对象的submit方法,提交任务

  • 关闭线程池(一般不做)

  1.3 线程池的使用:提交了Callable任务

  • 通过工具类ExecutorService调用静态方法:newFixedThreadPool创建线程池对象并制定线程的数量。

  • 创建一个类实现Callable接口,重写call方法,将线程任务相关的代码写在call方法中

  • 调用线程池对象的submit方法,提交任务

  • 关闭线程池(一般不做)

  1.4 Callable接口和Runnable接口的区别:

    Callable接口中call方法有返回值,可以声明异常

    Runnable接口中的run方法没有返回值,不能声明异常(编译时异常)

  1.5 Callable接口和Runnable接口选择:

  判断任务执行完毕之后是否需要有一个返回值给调用者。如果需要,选择Callable;如果不需要,两个都可以。

2、 线程等待与唤醒机制概述

又称为线程间通信两个或多个线程在执行任务过程中相互协作共同完成任务。

      2.1 线程等待与唤醒机制相关方法

void wait();     //等待,让当前正在执行的线程释放CPU使用权,进入等待状态

void notify():  //唤醒,随机唤醒一个正在等待的线程,让其进入可运行状态

void notifyAll();      //唤醒所有正在等待的线程,让其进入可运行状态

这三个方法必须由锁对象调用且必须在同步代码块或同步方法中调用。

3、 Lambda表达式

  3.1 Lambda表达式概述

    

函数式编程思想的体现。函数式编程思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做。

  Lambda表达式是JDK1.8新特性

  Lambda表达式可以简化匿名内部类复杂代码编写。只专注做什么,而不是怎么做。

  3.2 Lambda 表达式格式

                  

    3.2.1 Lambda表达式的标准格式:

      3.2.1.1 格式:(数据类型 参数…) -> {//方法体},也叫匿名函数

      说明:

      ():等价于方法的参数列表

      -> :新语法,固定写法,代表指向,小括号中参数可以在方法体中使用

      {}:等价于方法体

      3.2.1.2 Lambda表达式的使用前提条件:

       必须是接口且接口中只有一个抽象方法

      3.2.1.3 Lambda表达式的原理:

        创建了接口的实现类对象,重写了接口中的抽象方法

    3.2.2 Lambda表达式省略格式:

    格式:(参数…) -> {//方法体}

     省略规则如下:

      小括号中的参数类型可以省略,不管有几个参数

      如果小括号中只有一个参数,可以省略小括号

      如果方法体中只有一条语句,则可以省略大括号;如果省略了大括号,则return语句和分号必须要省略。

4. 使用线程注意事项

  • 把多线程共享的数据、变量放在类里面的成员变量里去定义,且定义成static。

  • 把各个线程私有的统计数据、变量放在run方法里面定义。这是因为各个线程是new 出来的,都拥有各自run方法里面的局部变量。

day007-线程池、Lambda的更多相关文章

  1. 等待唤醒机制----线程池----lambda表达式

    1.等待唤醒机制 1.1线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的 ...

  2. 01 语言基础+高级:1-7 异常与多线程_day07 【线程池、Lambda表达式】

    day07[线程池.Lambda表达式] 主要内容 等待与唤醒案例 线程池 Lambda表达式 教学目标 -[ ] 能够理解线程通信概念-[ ] 能够理解等待唤醒机制-[ ] 能够描述Java中线程池 ...

  3. 328 day07线程池、Lambda表达式

    day07[线程池.Lambda表达式] 主要内容 等待与唤醒案例 线程池 Lambda表达式 教学目标 -[ ] 能够理解线程通信概念 -[ ] 能够理解等待唤醒机制 -[ ] 能够描述Java中线 ...

  4. Java线程池 与Lambda

    七.线程池.Lambda 1.1基本概念: ​ 线程池:其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多的资源. 1.2线程池的好处: ...

  5. Java之线程池和Lambda表达式

    线程池和lambda表达式 学习线程池和lambda表达式的理解 补充一个知识点(单例设计模式) 在多线程中,我们只需要一个任务类,为了防止创建多个任务类,这个时候就需要用到单例模式,单例模式有两种设 ...

  6. 线程池、Lambda表达式

    线程池.Lambda表达式 线程池.Lambda表达式 线程池.Lambda表达式 线程池.Lambda表达式 线程池.Lambda表达式 线程池.Lambda表达式 线程池.Lambda表达式 (正 ...

  7. 线程池和lambda表达式

    线程池1.什么是线程池.一个用来创建和管理线程的容器;2.线程池的作用.提高线程的复用性,降低资源消耗提高线程的响应速度,提高线程的可管理性3.线程的核心思想;线程的复用 4.线程池的创建Execut ...

  8. JavaSE学习笔记(13)---线程池、Lambda表达式

    JavaSE学习笔记(13)---线程池.Lambda表达式 1.等待唤醒机制 线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用 ...

  9. Java【线程池、Lambda表达式】

    见pdf 等待唤醒机制 wait和notify 第二章 线程池 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低 系统的效率,因为频繁创建线程和销毁 ...

  10. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

随机推荐

  1. Kibana6.x.x---编译源码,在执行优化任务时,报警告

    wangxuan@tryman:/home/kibana_git/kibana6.2.2$ yarn release yarn run v1.5.1 $ grunt release Running & ...

  2. POJ3635 Full Tank? 优先队列BFS or 分层图最短路 or DP?

    然而我也不知道这是啥啊...反正差不多...哪位大佬给区分一下QWQ.. 好的,我把堆的<写反了..又调了一个小时..你能不能稳一点.... 记录状态:所在位置u,油量c,花费w 扩展状态: 1 ...

  3. Mysql 忘记密码----修改Navicat的连接密码--以及--(加入安装Navicat时没设置密码)有时新建连接设置密码,连接不成功---的问题解决方法

    密码忘记的解决 可以参考http://jingyan.baidu.com/article/454316ab4e9e65f7a7c03ad1.html 1.安装路径(复制安装路径) 2.打开cmd命令提 ...

  4. PIE SDK矢量数据的读取

    1.功能简介 GIS将地理空间数据表示为矢量数据和栅格数据.矢量数据模型使用点.线和多边形来表示具有清晰空间位置和边界的空间要素,如控制点.河流和宗地等,每个要素被赋予一个ID,以便与其属性相关联.栅 ...

  5. scala 列表的子集判断

    val list1=List.range(0,5) val list2=List.range(0,2) val list3=List(0,6) list1.contains(2) list1.cont ...

  6. ansible 实战项目之文件操作(二)

    一,前言 如果没有安装好的话看我以前的贴子哦!! 上次安装已经确定通了,所以下面步骤应该是完全ok的 特点: (1).轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可: (2 ...

  7. 企业DevOps构建 (一)

    一,环境: tomcat 7.0.92 jenkins 1.658 maven mysql 5.5.23 mongodb 2.6.11 redis 4.0.12   01, 安装jenkins wge ...

  8. AutoFac之 Named and Keyed 方式注入

    AutoFac是.net framework下一个高效的ioc容器,传说中的效率最快(我偷偷看了几篇测试博文,确实这个容器的效率遥遥领先). 好了废话不多说,AutoFac的使用方式请看:http:/ ...

  9. 突破Http协议

    突破Http协议 我到不先说什么Http什么的,对于HTTP的彻底理解是http是应用层的一个程序,就像我们写的诸多客户端和服务器模型,我们可能为了可靠,为了方便数据的解析,我们在数据包中其实就是结构 ...

  10. js 中移动元素的方法

    2017-12-13 19:59:24 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...