背景
学习java过程中,偶有一些由此及彼或针对于此想深入探究的疑问,搜索几篇好文章读后有所释疑。
问题与解答
java日志框架
java日志框架很多,它们之间的关系、怎么选择使用哪个却不清楚,读了参考文章,有所收获。推荐的是slf4j+logback的组合。slf4j和jcl是外观接口,底层实现有jul、log4j、logback、log4j2。不同的日志框架如何相互转化可参考如下文章。
参考文献
https://blog.csdn.net/weixin_40912883/article/details/88711495(终于搞懂了Java 日志系统依赖)
https://zhuanlan.zhihu.com/p/24272450(Java 日志框架解析(上) - 历史演进)
https://zhuanlan.zhihu.com/p/24275518(Java 日志框架解析(下) - 最佳实践)
https://blog.csdn.net/m2606707610/article/details/102968962(SpringBoot底层日志依赖关系及日志框架的讲解和使用)
java中如何中断
补获中断异常是很常见的用法,但如何触发中断呢?如下文章讲的很好。正在运行的线程是无法中断的,只有wait、join、sleep的线程可以被中断。对线程发出中断是调用thread.interrupt(),这是一个实例方法。但中断发出后并不意味着该线程一定会中断,取决于线程中是否对中断状态进行了判断。
要想中断起作用,用三种方式:信号量(即标志位,主线程通过置位标志位,子线程通过对标志位的判断决定是否继续循环)、抛出异常法(主线程通过调用实例方法thread.interrupt(),子线程通过try catch InterruptedException来补捉)、Thread.interrupted监听(主线程通过调用实例方法thread.interrupt(),子线程通过调用Thread.interrupted作为循环是否进行的标志)。
静态方法Thread.interrupted发现中断状态为true时,会将标志位恢复为未中断状态。实例方法thread.isInterrupted不影响中断状态标志位。这两个的区别需要注意一下。
参考文献:
https://www.cnblogs.com/moongeek/p/7610784.html
java.lang.Void是干啥的
背景:跟踪EnableConfigurationPropertiesRegistrar源码发现filter((type) -> {
return Void.TYPE != type;
}),不清楚这个类的作用。
看参考文章,似乎就是一个表示null的类型占位符。在返回为空时可以用它来占位泛型,函数返回值为Void表示函数只能返回null。似乎Void类型是为函数式编程及泛型而生。
参考文献:
https://www.jb51.net/article/131118.htm
Object.getClass返回的是子类还是父类
javadoc说返回的是runtime class,意思是如果将子类实例赋值给父类变量,调用getClass返回的是子类类型。
org.springframework.boot.context.TypeExcludeFilter的match方法中比较getClass() == TypeExcludeFilter.class,估计是不想被子类使用这一块逻辑。
参考文献:
https://stackoverflow.com/questions/40486720/what-is-a-runtime-class-in-java