JDK1.8的新特性:
匿名内部类访问其所在方法的局部变量时, 可以不用写final了, 因为系统会默认给加上.
JDK1.8以前必须得写.
加上final的作用是: 为了延长变量的声明周期.
面试题
1. 多线程并行和并发的区别是什么?
2. Java程序是多线程的吗?
是, 因为至少开启了 main(主线程), GC(垃圾回收机制).
public class ThreadCountTest {
public static void main(String[] args) {
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false,false);
for (ThreadInfo info : threadInfos ) {
System.out.println("[" + info.getThreadId() + "]" + info.getThreadName());
}
}
}
3. 多线程的两种实现方式之间的区别是什么?
继承Thread类:
好处: 代码相对比较简单. //因为是继承Thread类, 所以可以直接使用Thread类中的非私有成员.
弊端: 扩展性相对较差. //因为是继承, 而Java中类之间的继承只能单继承, 不能多继承, 但是可以多层继承.
实现Runnable接口:
好处: 扩展性相对较强.
弊端: 代码相对比较 繁琐.
//繁琐, 冗余, 困难
4. 多线程的执行特点是什么?
5. 多线程的默认命名规则是什么?
Thread-编号, 编号是从0开始的.
6. 当匿名内部类访问其所在方法的局部变量时, 该变量必须加final修饰, 为什么?
原因: 为了延长该变量的生命周期.
但是JDK1.8之后, final可以不写, 因为程序会默认加上.
7. 请手写一个死锁的代码.
8. 多线程的生命周期是什么?
新建, 就绪, 运行(有可能会发生阻塞), 死亡.
//新建, 就绪, 运行(有可能会发生阻塞或者等待状态), 死亡.