1、如何等到所有子线程执行完毕再往下执行主线程业务?(如何判断所有子线程都执行完毕主线程才继续执行?)
利用CountDownLatch的计数器实现(JUC包)
创建并执行线程,在子线程run方法中,调用countDown()方法进行计数+1
创建线程完毕完毕后,在主线程方法调用await()方法,该方法会等待所有子线程完毕计数器减为0,主线程才会唤醒继续往下执行。
2、深拷贝和浅拷贝的区别?怎么实现深拷贝?
A a = new A(xxxx);
a.clone();
class A{
String name; ox1
int age;
B b; ox4
}
class A1{
String name; ox2
int age;
B b; ox5
}
浅拷贝(默认情况下):当如果要拷贝一个A对象,而A对象中又有一个B对象,那么如果对A拷贝的时候,重新拷贝出来一个A1对象并且重新分配内存地址,但是对于A中的B对象,仅仅只是把A1中拷贝出来的B1对象的引用指向原来的B对象而已,并没有把拷贝的B1对象也重新进行分配一个新的内存地址。
深拷贝:而深拷贝就是在第1的基础上,不仅重新给A1对象分配了新的内存地址,而且还给A1中的B1也重新进行分配了新的内存地址,而不只是仅仅把原本的B的引用给B1。
如果想要深拷贝一个对象,这个对象必须要实现 Cloneable 接口,实现 重写clone() 方法,并且在 clone 方法内部,把该对象引用的其他对象也要 clone 一份,这就要求这个被引用的对象必须也要实现Cloneable 接口并且实现 clone 方法
3、什么是序列化和反序列化?什么时候需要序列化或反序列化?序列化的底层怎么实现的?
什么是序列化和反序列化?
1)序列化:Java对象变为二进制数据的过程
2)反序列化:二进制的数据变为Java对象的过程
什么时候需要序列化或反序列化?
1)把JavaBean对象读写磁盘
2)让JavaBean通过网络传输 (RPC远程调用就是对象传输,就需要序列化 )
怎么对JavaBean序列化或反序列化:
让JavaBean实现Serializable接口
Java实现序列化的底层代码:
1)ObjectOutputStream: 对象序列化工具 writeObject(Object)
2)ObjectInputStream: 对象反序列化工具 Object readObject()
4、Runnable 和 Callable 的 区别?
===相同点====
1)两者都是接口
2)两者都可以用来编写多线程代码
3)两者都可以调用Thread.start()来启动线程
==不同点====
1)最大的区别,Runnable没有返回值,而实现Callable接口的任务线程能返回执行结果
2)Callable接口实现类中的run方法允许异常向上抛出,可以在内部处理,try catch,但是Runnable接口实现类中run方法的异常必须在内部处理,不能抛出
3)Runnable可以作为Thread构造器的参数,通过开启新的线程池来执行,也可以通过线程池来执行;而Callable只能通过线程池来执行。
