zoukankan      html  css  js  c++  java
  • java学习与应用(3.3)--异常、多线程、lambda简

    异常

    异常是一个类,顶层父类为Throwable,分Error(错误,必须修正代码)和Exception(编译期异常)。Exception下有RunTimeException(运行期异常)。
    alt+回车选择try catch,可以抛出异常(编译期异常,运行期异常)的处理使得继续执行,或者抛出到函数上终止执行。
    发生异常时,JVM创建异常对象,没有try catch则发送给方法的调用者main,main方法提交到JVM处理,JVM打印并终止java程序。
    try catch finally throw throws。
    throw在指定方法抛出指定异常,如在方法内部:throw new xxxException(“原因”)。对于RuntimeException或子类通过JVM处理(运行异常),编译异常使用trycatch或throws处理。
    Objects工具类的非空静态方法:requireNonNull方法,自动判断值是否为空然后抛出异常。
    throws将异常对象抛出(throw)给方法的调用对象。最终交给JVM中断处理,在方法声明时候使用,格式如:throws AAAException,...写在方法的声明处。异常必为Exception或子类,抛出时候有子父类关系只声明父类。返回上级后的函数仍然需要抛出异常声明。
    trycatch(xxxException e)格式处理异常,可使用多个catch,分别处理各个异常。
    Throwable类中对象(e)的异常处理方法,如getMessage返回简短信息,toString返回详细信息,printStackTrace返回最详细的信息。
    finally代码块,用于执行try中可能中断的而未执行的代码,其内部代码一般用于资源释放。由于finally中的代码必定执行,因此需要避免写return语句消除和方法中其他位置的冲突。
    多异常捕获时(一次捕获多次处理)需要将catch的子类异常先写,父类后写。或分开多个trycatch(一次捕获一次处理)进行判断。
    子类重写父类方法抛出异常时,需要声明父类异常,父类异常的子类,或者不抛出异常。父类没有抛出异常时,子类不抛出异常,或只能使用捕获处理,不能throws抛出。
    自定义异常,继承Exception(编译期异常)或RuntimeException(运行期异常),然后定义构造方法,和带字符串参数的构造方法,调用父类的对应方法。

    并行与并发

    多线程

    多线程,并发,时间片调度,并行,多个核的同时执行。进程,进入内存的应用程序,线程,进程的一个执行单元
    线程调度有分时调度(平均时分)和抢占式调度(优先级时分)。主线程(main方法的线程)。
    使用Thread类的子类创建线程,重写其中的run方法设置线程任务,创建其对象,调用对象中的start方法启动。结果是和main线程一起,进行并发执行(抢占式调度,由JVM控制线程)。
    除main线程的其他线程运行时,重新开辟新栈空间,由CPU选择执行多个栈中的代码。
    Thread中的静态方法currentThread方法,获取当前正在执行的线程对象。Thread的getName方法获取当前线程名称。
    改变线程名称:使用setName方法,或者使用带参数构造方法继承父类初始化创建设置。暂停线程Thread的静态方法sleep(单位为毫秒),添加异常处理使用。
    Runable接口也可以创建线程,实现该接口,重写其中run方法设置任务,创建自定义的对象,使用Thread带入该自定义对象,通过Thread的start开启多线程。
    Runable接口创建线程避免了单继承的局限性,并增强了程序的扩展性,传递不同的参数,创建不同的线程。
    在方便情况使用匿名内部类,实现多线程更清晰。

    线程安全问题

    线程安全问题,多线程访问共享数据,导致变量的不同步,错误进行判断和操作。
    同步代码块,格式为:在run中使用:synchronized(锁对象[Object]){可能出现不同步的代码}。
    同步方法,public synchronized void xxx(){共享数据代码},通过run调用同步方法,进行保护。锁对象其实为this。
    Lock接口,获取锁lock方法,释放锁unlock方法。创建ReentrantLock对象,格式为:{获取锁;可能出现安全问题的代码;释放锁},释放锁放到finally更优。

    线程状态

    线程状态六种,调用不同可切换状态。计时等待状态,无限等待状态和运行状态的切换等。
    使用同步代码块,并创建一个唯一锁对象obj(或其他唯一对象)(保证等待和唤醒的线程只能有一个执行,需要使用同步技术),使用obj.wait和obj.notify方法切换,实现线程间的通信。
    sleepm和waitm计时等待后自动判断并执行。 notifyAll方法唤醒所有等待线程。notify唤醒随机一个线程。
    线程池技术,线程队列,取出,归还线程,以降低系统消耗。
    Executor生产线程池类,static ExecutorService newFixedThreadPool(int nThreads)创建线程池。
    ExecutorService接口提供方法submit提交Runable任务执行,执行完自动归还。shutdown销毁线程池。
    格式如:ExecutorService es=Executors.newFixedThreadPool( nThreads: 2);es.submit(new RunnableImp1());es.shutdown()

    Lambda表达式

    lambda表达式,简化匿名类和重写方法,格式如:(重写的方法形参数)->{重写的方法中的内容}
    凡是根据上下文推导出来的内容,都可以省略书写,(如接口中有且仅有一个抽象方法)。
    可以省略的内容:括号中参数列表的数据类型,可以省略不写,括号中的参数如果只有一个,那么类型和( )都可以省略,如果{}中的代码只有一行, 无论是否有返回值都可以省略({},return,分号一起省略)

  • 相关阅读:
    【解决办法】移动硬盘在电脑上显示“本地磁盘”并且出现打不开的情况
    在Windows上搭建Python环境
    Thymeleaf模板的使用
    thymeleaf中的th:remove用法
    AngularJS PhoneCat代码分析
    AngularJS PhoneCat代码分析
    利用java反射调用类的的私有方法--转
    Java Reflection (JAVA反射) --转载
    Eclipse 常用快捷键 (动画讲解)--转载
    三大JavaScript框架对比——AngularJS、BackboneJS和EmberJS
  • 原文地址:https://www.cnblogs.com/bai2018/p/12284540.html
Copyright © 2011-2022 走看看