• 线程状态


    线程状态:分为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);
    
        }
    
    
    }
  • 相关阅读:
    jquery ajax loading效果
    php中count 多维数组长度统计实现方法
    jquery 中Map、each的应用
    转:php获取网页内容方法总结
    经典JavaScript正则表达式实战
    JQuery this 和 $(this) 的区别
    Windows Server 2003 的 Boot.ini 文件的/3GB开关选项
    用ghost装双系统(装03,xp系统)
    Possible memory leak with ReportViewer.RefreshReport() ReportViewer内存回收缺陷
    添加IIS出错,提示缺少CONVLOG.exe文件
  • 原文地址:https://www.cnblogs.com/YwhsR0129/p/13695410.html
Copyright © 2020-2023  润新知