线程状态:分为6种情况
导致状态发生条件 | |
---|---|
NEW(新建) | 线程刚被创建,但是并未启动。还没调用start方法。MyThread t = new MyThread()只有线程对象,没有线程特征。创建线程对象时 |
Runnable(可运行) | 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。调用了t.start()方法 :就绪(经典教法)。调用start方法时 |
Blocked(锁阻塞) | 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。等待锁对象时 |
Waiting(无限等待) | 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。调用wait()方法时 |
Timed Waiting(计时等待) | 同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep (毫秒值)、Object.wait。调用sleep()方法时 |
Teminated(被终止) | 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。 |
图解:
等待唤醒机制:(用于有效利用资源)
wait/notify就是线程间的一种协作机制
- 必须使用锁对象调用wait方法,让当前线程进入无线等待状态
- 必须使用锁对象调用notify otifyAll方法唤醒等待线程
- 调用wait ottifi otifiAll方法的锁对象必须一致
分析的观点唤醒机制程序:
- 线程的调度还是抢占式
- 线程进入无线等待状态,就不会霸占cpu和锁对象(释放),也不会抢占cpu和锁对象
- 如果是在同步锁Lock锁中,调用sleep方法进入计时等待,不会释放cpu和锁对象(依然占有,装睡)
写代码四步:确认几条线程,确认锁对象,确认等待机制,确认唤醒机制
注意:无论是定义wait还是notify otifyAll的使用都必须在有锁对象的情况下
Lambda表达式:
不通过对象的方式,使用函数式编程思想,直接执行任务,不依靠对象---强调做什么,而不是以什么形式
函数编程的格式(参数类型 参数名,参数类型,参数名)—>{ 代码语句};()-->
- 小括号当中的参数,传递给大括号中使用
- 小括号的参数要和接口中的抽象方法列表一致,无参则留空,多个参数用逗号隔开
作用:简化代码
使用条件:
- 当且仅当接口中只有一个抽象方法的接口,才可以使用Lambda表达式替换其实现类
- 接口中只有一个抽象方法的接口,叫做函数式接口
- 如果式函数式接口,那么就可以使用@FunctionalInterface
使用Lombda表达式:
- 判断接口是否式函数时接口
- 如果是函数式接口,那么直接写()-->{ }
- 然后填充(){ }
省略格式:
- 小括号中的形参类型可以省略
- 如果小括号中只有一个参数,那么小括号和形参类型可以一起省略
- 如果大括号中只有一条语句,那么大括号,分号,return可以一起省略
使用场景:
- 变量的形式
- 参数的形式
- 返回值的形式
Stream流:
package zw.Demo02Stream流; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; /** * zw * https://www.cnblogs.com/YwhsR0129/ * 2020/9/19,19:17 */ /* * 1. 第一个队伍只要名字为3个字的成员姓名; 2. 第一个队伍筛选之后只要前3个人; 3. 第二个队伍只要姓张的成员姓名; 4. 第二个队伍筛选之后不要前2个人; 5. 将两个队伍合并为一个队伍; 6. 根据姓名创建`Person`对象; 7. 打印整个队伍的Person对象信息。 * */ public class Test { public static void main(String[] args) { List<String> one = new ArrayList<>(); one.add("迪丽热巴"); one.add("宋远桥"); one.add("苏星河"); one.add("老子"); one.add("庄子"); one.add("孙子"); one.add("洪七公"); List<String> two = new ArrayList<>(); two.add("古力娜扎"); two.add("张无忌"); two.add("张三丰"); two.add("赵丽颖"); two.add("张二狗"); two.add("张天爱"); two.add("张三"); //1. 第一个队伍只要名字为3个字的成员姓名; //2. 第一个队伍筛选之后只要前3个人; Stream<String> limit1 = one.stream().filter(name -> name.length() == 3).limit(3); //3. 第二个队伍只要姓张的成员姓名; //4. 第二个队伍筛选之后不要前2个人; Stream<String> limit2 = two.stream().filter(name -> name.startsWith("张")).skip(2); //5. 将两个队伍合并为一个队伍; //6. 根据姓名创建`Person`对象; //7. 打印整个队伍的Person对象信息。 Stream<Person> personStream = Stream.concat(limit1, limit2).map(name -> new Person(name)); Set<Person> collect = personStream.collect(Collectors.toSet()); System.out.println(collect); } }