Java干货——Part2

Java干货——Part2


Author:TheRa1nMan


1、进程和线程的区别是什么?
进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。


2、创建线程有几种不同的方式?你喜欢哪一种?为什么?
有三种方式可以用来创建线程:

1)继承Thread 类
2)实现Runnable 接口
3)应用程序可以使用 Executor 框架来创建线程池

实现Runnable 接口这种方式更受欢迎,因为这不需要继承Thread 类。在应用设计中已经继承了别的对象的情况下,这就需要多继承(而Java 不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和利用。


3、概括解释线程的几种可用状态
1)新建(new):创建了一个线程对象
2)可运行(runnable):线程对象创建后,其他线程(比如 main 线程)调用了该对象的 start () 方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取 cpu 的使用权。
3)运行(running):当可运行状态的线程获得了 cpu 时间片(timeslice),执行程序代码。
4)阻塞(block):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice,暂时停止运行。直到线程进入可运行状态,再有机会再次获得 cpu timeslice 转到运行状态。
5)死亡(dead):线程 run()、main() 方法执行结束,或者因异常退出了 run() 方法,则该线程结束生命周期。死亡的线程不可再次复生。

补充一下,线程阻塞的情况分为三种
1.等待阻塞:运行(running)的线程执行 o.wait() 方法,JVM会把该线程放入等待队列(waitting queue)中。
2.同步阻塞:运行(running)的线程在获取对象的同步频时,若该同步频被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
3.其他阻塞:运行(running)的线程执行Thread.sleep(long ms) 或 t.join() 方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。
Java干货——Part2_第1张图片


4、同步方法和同步代码块的区别是什么?
同步方法默认用 this 或者当前类 class 对象作为锁;
同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法。


5、在监视器(Monitor)内部是如何做到线程同步的?程序应该做哪种级别的同步?
监视器和锁在 Java 虚拟机中是一块使用的。监视器监视一块同步代码,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。


6、什么是死锁?(deadlock)
两个线程或两个线程以上都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。


7、如何确保 N 个线程可以访问 N 个资源同时又不导致死锁?
使用多线程的时候,一种非常简单的避免思索的方法是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。


8、Java 集合类框架的基本接口有哪些?
集合类接口制定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。
Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java 集合类里面最基本的接口有:
Collection:代表一组对象,每一个对象都是他的子元素。
Set:不包含重复元素的 collection 。
List:有顺序的 collection,并且可以包含重复元素
Map:可以把(key)映射到(value)的对象,键不能重复。


9、为什么集合类没有实现Cloneable 和 Serializable 接口?
克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。






下一期主要内容为:迭代器、HashMap、数组相关知识,一起加油。

你可能感兴趣的:(干货)