线程状态

线程状态:分为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方法而死亡。run方法执行结束时

图解:

 

等待唤醒机制:(用于有效利用资源)

wait/notify就是线程间的一种协作机制

  • 必须使用锁对象调用wait方法,让当前线程进入无线等待状态
  • 必须使用锁对象调用notify otifyAll方法唤醒等待线程
  • 调用wait ottifi otifiAll方法的锁对象必须一致

分析的观点唤醒机制程序:

  • 线程的调度还是抢占式
  • 线程进入无线等待状态,就不会霸占cpu和锁对象(释放),也不会抢占cpu和锁对象
  • 如果是在同步锁Lock锁中,调用sleep方法进入计时等待,不会释放cpu和锁对象(依然占有,装睡)

写代码四步:确认几条线程,确认锁对象,确认等待机制,确认唤醒机制

 注意:无论是定义wait还是notify otifyAll的使用都必须在有锁对象的情况下

 

Lambda表达式:

不通过对象的方式,使用函数式编程思想,直接执行任务,不依靠对象---强调做什么,而不是以什么形式

函数编程的格式(参数类型 参数名,参数类型,参数名)—>{ 代码语句};()-->

  1. 小括号当中的参数,传递给大括号中使用
  2. 小括号的参数要和接口中的抽象方法列表一致,无参则留空,多个参数用逗号隔开

作用:简化代码

使用条件:

  • 当且仅当接口中只有一个抽象方法的接口,才可以使用Lambda表达式替换其实现类
  • 接口中只有一个抽象方法的接口,叫做函数式接口
  • 如果式函数式接口,那么就可以使用@FunctionalInterface

使用Lombda表达式:

  1. 判断接口是否式函数时接口
  2. 如果是函数式接口,那么直接写()-->{  }
  3. 然后填充(){ }

省略格式:

  1. 小括号中的形参类型可以省略
  2. 如果小括号中只有一个参数,那么小括号和形参类型可以一起省略
  3. 如果大括号中只有一条语句,那么大括号,分号,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);

    }


}
原文地址:https://www.cnblogs.com/YwhsR0129/p/13695410.html