Android面试笔记总结(一)

有总结的工作才有意义,有总结的人生才会有进步。
本系列面试笔记所有问题,源自面试过程中的记录总结,主要涉及Java和Android,但是由于面试过程中任何问题都有可能被问到,所以也会涉及一些其他方向的知识。部分答案参考网上朋友的文章,如有错误之处,欢迎批评指正。奋斗

这篇笔记主要记录了在Java多线程编程方面被问到的一些问题。

1 简述一下线程和进程之间的关系?

答:线程是程序执行的基本单元。一个进程包含了很多个线程。在内存方面,进程与进程之间不共享内存,同一个进程的多个线程可以共享分配给这个进程的内存空间。每一个线程还拥有一个自己的内存空间,这段内存空间就是传说中的线程栈,线程栈是在建立线程时由系统分配,主要用来保存线程内部所使用的数据。

2 java程序建立一个线程的形式有几种?各有什么好处?

答:Java程序建立线程一般有两种方式,第一种就是继承Thread类,第二种方法就是实现Runnable接口。这两种方法没有什么好坏之分,都可以创建一个子线程。之所以有这两种方法时因为java语言特点是不允许存在多继承的,当一个程序已经拥有了父类,就不可以在继承Thread类来实现多线程,这时

就要通过实现Runnable接口来实现多线程。

3 终止一个线程的方法有哪些?

答:I 使用退出标志,使线程正常退出,也就是run()方法运行结束自动退出。

    II 使用stop()方法强制退出,终止线程。(不推荐使用)

    III 使用interrupt()方法中断线程。 

4 线程中join()方法的作用是什么?

答:join()方法的功能就是使异步执行的线程变成同步执行。例如:

thread.start();
thread.join();
System.out.print("只有thread执行完才输出这句");

5 sleep()和wait()方法的区别是什么?

答:sleep()是线程类的静态方法。wait()和notify()是object类的方法。对于程序中的每一个对象可以使用一个机锁来控制这个对象的同步访问。synchronized这个关键字可以和对象的锁进行交互,来实现线程的同步访问。由于sleep()方法时Thread类的方法,他不能改变对象锁的状态(只有object类的方法才能改变),所以当调用sleep()方法时,虽然线程休眠了,放弃了对cpu的使用,但是这个线程拥有的共享资源对象没有被释放(因为锁的状态没变),其他线程仍无法使用这个休眠线程占用的共享对象资源。而wait方法会在线程休眠的同时释放共享的资源对象(因为wait方法时object类的方法,可以改变对象锁的状态),其他线程可以访问该对象。

值得注意的是:sleep是Thread类的静态方法,只能是自己的线程进行休眠,在线程A中调用B.sleep()不会使B线程休眠,会使线程A休眠。并且线程在被激活后不能马上就运行,而是进入线程的就绪队列进行等待CPU的调度。另外,wait()方法只能在synchronized块中被调用,而sleep()不需要。

6 wait()和notify()方法之间的联系?

答:当一个线程执行到wait()方法时(线程休眠且释放共享对象的对象锁),它就进入了一个和该线程使用的共享资源对象有关的等待池中等待被唤醒。当它被notify()方法唤醒时,等待池中的对象就会获得共享资源对象的锁,当被cpu再次调度时,就会重新返回wait()方法中断前的中断现场。

7 谈谈对线程interrupt()方法的理解。

答:如果线程A希望线程B立刻结束,则可以对线程B对应的线程实例调用interrupt()方法。如果此时线程B正处于sleep/wait/join的状态,则线程B会立刻抛出InterruptedException异常,在catch块中捕获这个异常,然后return即可安全退出,B线程运行结束。

值得注意的是:InterruptedException异常是线程自己从内部抛出的,并不是interrupt方法抛出的。对一个线程使用Interrupt方法时,如果这个线程正在执行普通代码,则线程不会抛出InterruptedException异常,但是当这个线程再次运行到sleep/wait/join方法时,就会立刻抛出InterruptedException异常。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章