AKSTIANYE

Dec 10, 2018

关于java一些零零散散的点(二)


instanceof与Class.isInstance(Object obj)的区别

  • instanceof

  • instanceof运算符只能被用于对象引用变量

  • 运算符左侧为被测对象

  • 测试被测对象是否为运算符右侧类或接口的实例

  • Class.isInstance(Object obj)

  • obj为被测对象

  • 测试被测对象是否为Class的实例


不定项参数个数的问题

  • 传入单个 数组
    数组中每个元素为一个参数
  • 传入多个 数组
    每个数组为一个参数
  • 传入集合
    每个集合为一个参数

JDK动态代理与CGLIB

  • JDK动态代理
    针对接口实现,被代理类需要实现接口,只能代理接口方法,java自带,无需引入外部包

  • CGLIB
    通过生成被代理对象的子类实现,可代理被代理对象内public,protected方法,被代理类不能是final类型,需要外部引入包


反射获取方法参数名

  • java.lang.reflect.Parameter类
    通过method.getParameters()获取得到参数
    在通过参数getName()方法得到参数名

  • 若得到的事arg0等名称
    是因为编译版本小于1.8

  • idea中可通过Java Compiler中设置模块编译版本大于1.8
    并且在Additional command line parameters中
    设置 -parameters

  • maven中可以配置插件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
    <compilerArgument>-parameters</compilerArgument>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
    </plugin>

子线程中异常的捕获

  • 子线程中的异常,可以根据情况在子线程中处理
  • 若需要在父线程中处理,可使用java中的Future,
    线程池执行任务时,使用submit()而不是execute()
  • submit方法有一个返回值,可用于获取线程执行结果,即Future.get(),该方法在线程内部抛出异常时,可catch到ExecutionException,使用ExecutionException.getCause()即可得到内部异常。
  • 注意
    • Future.get()会阻塞函数以获取结果

一次线程池死锁问题

写在前面:

使用线程池时,不要在Task中嵌套Task

简单解释:

newFixedThreadPool在当前池内线程全部被使用时,后来的任务会进行排队。此时,一个Task内部提交了一个新的Task,这个新的Task会进行排队。外部Task需要等待内部Task完成才会释放线程给后来的任务使用,而此时内部Task在排队,无法完成,进而导致双方都无法完成,形成死锁。

参考
线程池使用不当也会死锁?


OLDER > < NEWER