多线程,线程通信,线程池和Lambda表达式

1. 多线程

1.1 线程状态 WAITING(无限等待)
当某一个线程被执行wait()方法,需要等待另外的一个线程进行唤醒操作。一下三个方法都是Object类内的方法:public void wait();在哪一个线程中执行,就会让当前线程进入一个无限等待状态。1. 所在线程进入无限等待状态2. 开启【锁对象】public void notify();唤醒和当前锁对象有关的无限等待线程中的一个,随机选择。1. 唤醒一个无限等待状态线程2. 开启【锁对象】public void notifyAll();唤醒所有和当前锁对象有关的无限等待线程1. 唤醒所有线程2. 开启【锁对象】3. 线程进入锁对象抢占过程,就有可能进入一个锁阻塞状态。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmF5FhJ4-1583759411509)(img\无限等待图例.png)]

1.2 线程执行的所有状态分析图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RrIK8zQ3-1583759411510)(img/六大线程状态.png)]

2. 线程通信

2.1 生活化例子
预约 --> 抢购
消费者 <--> 商品 <--> 生产者消费者1. 购买商品2. 等待,不过在等待之前,需要告知生产者快点生产生产者:1. 生产商品2. 休息,在休息之前,要告知消费者你快来买啊商品:就是两个独立线程之间的共享资源。
2.2 共享资源处理问题
现在存在两个完全无关的线程,生产者和消费者,但是商品会作为他们两者之间的共享资源。生产者和消费者中都有一个成员变量商品类型【解决方案】
创建生产者或者消费者线程对象时,使用同一个商品类对象,作为构造方法参数进行初始化操作
2.3 设计程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p19QcDWT-1583759411510)(img/生产者消费者图例.png)]

3. 线程池

3.1 线程池
 不管是继承Thread还是遵从Runnable接口,都需要重写Run方法,而且每一个线程对象有且只能执行一次,之后就会被销毁。利用Runnable接口来提供执行目标,而且借助于Thread执行线程。一个餐厅服务人员餐厅会按照餐桌比例安排服务员人数。每一个服务员我们都可以看做是一个线程对象需要告知服务器做什么事情就可以了,相对于告知线程对象执行目标是什么当你来餐厅之前,服务员在这里,你走之后,服务员依然在这类。线程池 ==> 可以容纳多个线程的容器程序可以从线程池获取线程来完成目标代码同时也可以将线程归还给线程池。省去了创建线程和销毁线程这样非常繁琐的操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wlVkyCeQ-1583759411511)(img/线程池任务执行参考图.png)]

3.2 线程池使用
 public static ExecutorService newFixedThreadPool(int nThreads);得到一个线程对象,初始化参数是要求的当前线程池中的线程数public Future submit(Runnable target);从线程池中获取一个线程对象,并且执行给定的Runnable接口实现类对象作为执行目标
package com.qfedu.b_executors;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;class MyThread1 implements Runnable {@Overridepublic void run() {System.out.println("Runnable接口实现类,线程目标代码");try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName() + " 明天吃土豆牛腩");}
}public class Demo1 {public static void main(String[] args) {// 1. 创建线程池对象ExecutorService service = Executors.newFixedThreadPool(5);// 2. 创建一个MyThread1 Runnable接口实现类对象、MyThread1 target = new MyThread1();// 3. 使用线程池对象中的一个线程,指定目标代码// 初始化线程数为5,这里使用的是线程池中已经存在的5个线程来执行代码service.submit(target);service.submit(target);service.submit(target);service.submit(target);service.submit(target);// 因为原本的5个线程都在被使用中,这里需要等待5个线程执行完毕,出现空闲线程// 来执行对应的目标代码service.submit(target);service.submit(target);// 4. 关闭线程池// 一般不用关闭线程池,会随着程序的退出而关闭// service.shutdown();}
}
3.4 从匿名内部类引入Lambda表达式
package com.qfedu.b_executors;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Demo2 {public static void main(String[] args) {ExecutorService service = Executors.newFixedThreadPool(5);service.submit(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}}); // lambda表达式service.submit(() -> System.out.println(Thread.currentThread().getName())); service.submit(() -> System.out.println(Thread.currentThread().getName())); service.submit(() -> System.out.println(Thread.currentThread().getName())); service.submit(() -> System.out.println(Thread.currentThread().getName()));  }
}

4. Lambda表达式

4.1 思想 “说重点”
service.submit(new Runnable() {                                          @Override                                                public void run() {                                      System.out.println(Thread.currentThread().getName());}
});                                                          /*
匿名内部类方式来作为线程池执行目标代码1. 这个方法需要的参数是Runnable接口的实现类对象2. Runnable接口目标是为了提供一个run 方法, What will be run3. What will be run??? where??? run方法内容这里需要Runnable提供Run方法,提供Run方法方法体"说重点"需要Run方法方法体
*/    
4.2 Lambda表达式格式
service.submit(() -> System.out.println(Thread.currentThread().getName())); /*() -> System.out.println(Thread.currentThread().getName())Lambda表达式() 参数列表-> 做什么事情,就是对应方法体箭头之后的代码就是正常语句(参数列表) -> {代码语句}
*/
4.3 Lambda表达式使用,无参数无返回值
package com.qfedu.c_lambda;/** 无参数无返回值*/interface Cook {void cooking();
}public class Demo1 {public static void main(String[] args) {invokeCook(new Cook() {@Overridepublic void cooking() {System.out.println("麻辣香锅,孜然肉片,土豆牛肉,蒜薹肉丝");}});invokeCook(() -> {System.out.println("蒜蓉油麦菜,番茄鸡蛋");});invokeCook(() -> System.out.println("明天早上自己炸油条"));}/*** 执行Cook实现类对象方法* * @param cook Cook接口的实现类对象*/public static void invokeCook(Cook cook) {cook.cooking();}
}
4.4 Lambda表达式使用,有参数有返回值
package com.qfedu.c_lambda;import java.util.Arrays;
import java.util.Comparator;public class Demo2 {public static void main(String[] args) {Person[] persons = {new Person("骚磊", 16),new Person("老黑", 50),new Person("老付", 40),new Person("污云", 35),new Person("朋朋", 14),new Person("大哥", 18),};// public static <T> void sort(T[] a, Comparator<? super T> c)Arrays.sort(persons, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {return o1.getAge() - o2.getAge();}});/** 1. 有参数* 2. 有返回值* * (Person o1, Person o2) -> {*         return o1.getAge() - o2.getAge();* }* 标准Lambda*/Arrays.sort(persons, (Person o1, Person o2) -> {return o2.getAge() - o1.getAge();});/** 1. 这里可以省略数据类型* 2. 可以直接利用返回值,{}和return都省了掉*/Arrays.sort(persons, (o1, o2) -> o2.getAge() - o1.getAge());for (Person person : persons) {System.out.println(person);}}
}
package com.qfedu.c_lambda;interface A {float add(int num1, float num2);
}public class Demo3 {public static void main(String[] args) {System.out.println(new A() {@Overridepublic float add(int num1, float num2) {return num1 + num2;}}.add(5, 13.5F));/** 1. 数据类型真的可以省略,虽然是不同数据类型,Java语言真香* 2. 实现的代码非一行,可以在大括号内完成你的目标*/test(5, 13.5F, (num1, num2) -> {float sum = num1 + num2;return sum;});  }public static void test(int num1, float num2, A a) {System.out.println(a.add(num1, num2));}
}
4.5 Lambda表达式使用前提
1. 有且只有一个缺省属性为public abstract方法的接口,例如 Comparator<T>接口,Runnable接口
2. 使用lambda表达式是有一个前后要求约束的方法的参数为接口类型,或者说局部变量使用调用方法,可以使用lambda也OK
3. 有且只有一个抽象方法的接口,称之为【函数式接口】
return sum;});
}public static void test(int num1, float num2, A a) {System.out.println(a.add(num1, num2));
}

}


##### 4.5 Lambda表达式使用前提
  1. 有且只有一个缺省属性为public abstract方法的接口,例如 Comparator接口,Runnable接口
  2. 使用lambda表达式是有一个前后要求约束的
    方法的参数为接口类型,或者说局部变量使用调用方法,可以使用lambda也OK
  3. 有且只有一个抽象方法的接口,称之为【函数式接口】

多线程,线程通信,线程池和Lambda表达式相关推荐

  1. day07【线程池、Lambda表达式】(1)

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

  2. 多线程、线程池以及Lambda表达式的总结笔记分享

    文章目录 1. 多线程技术 1.1 线程与进程 1.2 守护线程和用户线程 1.3 线程的六种状态 1.4 线程的调度 1.5 同步与异步 1.6 并发与并行 1.7 Thread类 1.7.1 Th ...

  3. java day18【线程池、Lambda表达式】

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

  4. 02java进阶03-异常、线程、同步、线程池、Lambda表达式、File类、递归

    目录 一.异常 二.异常的处理 三.自定义异常 四.多线程 五.线程.同步 5.1.线程 5.2同步 5.3线程安全 5.4线程状态 六.等待唤醒机制 6.1 线程间通信 6.2 等待唤醒机制 6.3 ...

  5. Java线程池与Lambda表达式

    Java线程池 有没有一种方法使得线程可以复用(反复使用),就是执行完一个任务,并不被销毁,而是可以继续执行其它的任务? 在Java中可以通过线程池来达到这样的效果 线程池:其实就是一个容纳多个线程的 ...

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

  7. Java基础巩固(二)异常,多线程,线程池,IO流,Properties集合,IO工具类,字符流,对象流,Stream,Lambda表达式

    一.异常,多线程 学习目标 : 异常的概述 异常的分类 异常的处理方式 自定义异常 多线程入门 1 异常的概述 1.1 什么是异常? 异常就是程序出现了不正常情况 , 程序在执行过程中 , 数据导致程 ...

  8. Python3进阶--Socket编程、多线程(创建方式、线程通信、线程锁、线程池)

    第一章 变量.常用循环体.代码结构.代码练习 第二章 列表.元组等数据结构.字符串驻留机制及字符串格式化操作 第三章 函数.面向对象.文件操作.深浅拷贝.模块.异常及捕获 第四章 项目打包.类和对象高 ...

  9. 多线程-静态代理-Lambda表达式

    文章目录 多线程 进程和线程 (Process and Thread) 线程 实现线程的三种方式 继承Thread类 实现Runable接口 实现Callable接口 静态代理 Thread底层实现方 ...

  10. Linux下的C编程实战(开发平台搭建,文件系统编程,进程控制与进程通信编程,“线程”控制与“线程”通信编程,驱动程序设计,专家问答)

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来,Linux ...

最新文章

  1. java 包含汉字,【转载】Java判断字符串中是不是包含汉字
  2. 圈复杂度本质上就是——分支覆盖率达到100%需要的测试用例数
  3. 【Linux】linux中删除指定文件外所有其他文件(夹)的问题
  4. [USACO1.5]回文质数 Prime Palindromes
  5. Docker 搭建java+tomcat
  6. 携程在港挂牌:两次疫情两次上市 穿越周期初心不灭
  7. 计算机改计数器的方法,第五章定时器计数器(修改)-计算机原理及应用资源共享课.ppt...
  8. sqlserver 常用存储过程集锦
  9. SpringBoot java串口操作(rxtx)
  10. delphi 剪切板变量_Delphi监视剪贴板内容
  11. CSS border 属性
  12. java毕业生设计web人力资源管理系统计算机源码+系统+mysql+调试部署+lw
  13. xp启用计算机共享打印机,Win7共享XP打印机设置方法【win7不能共享xp打印机】解决方法...
  14. 腾讯云服务器SSH密匙登录教程(创建密匙/关联/登录)
  15. 朴素贝叶斯(naive bayes)原理小结
  16. 通过USB在传统电视上播放B站视频
  17. Mac已安装应用启动台不显示
  18. Loadrunner分析
  19. NOIp2014 题解
  20. Javascript判断日期是否合法

热门文章

  1. MySQL ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
  2. 【杂谈分享】如何在中国大学MOOC高效学习?MOOC学习全面指北√
  3. win10虚拟机连接服务器失败怎么办,Win10虚拟机无法连接网络的解决方法教程
  4. 简述自动化测试实习收获
  5. 电信设备商进入企业网市场需适应不同渠道模式(转载)
  6. python 保存源码,python save保存图片系统提示错误请帮忙分析python源码,savepython,很基本的操作,比如imp...
  7. rancher部署安装好后,无法部署pod
  8. html作品实验报告,html网页制作实验报告.docx
  9. 并行接口8255芯片
  10. VMware Guided Consolidation