4.1 进程和线程的区别
进程是资源分配的最小单位,线程是CPU调度的最小单位。线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位。进程(Process)是操作系统分配资源的基本单位,一个进程拥有的资源有自己的堆、栈、虚存空间(页表)、文件描述符等信息。
进程和线程的区别主要体现在以下几点。
区别1:从属关系不同:进程是正在运行程序的实例,进程中包含了线程,而线程中不能包含进程。
区别2:描述侧重点不同:进程是操作系统分配资源的基本单位,而线程是操作系统调度的基本单位。
区别3:共享资源不同:多个进程间不能共享资源,每个进程有自己的堆、栈、虚存空间(页表)、文件描述符等信息,而线程可以共享进程资源文件(堆和方法区)。
区别4:上下文切换速度不同:线程上下文切换速度很快(上下文切换指的是从一个线程切换到另一个线程),而进程的上下文切换的速度比较慢。
区别5:操纵者不同:一般情况下进程的操纵者是操作系统,而线程的操纵者是编程人员。
4.2 Thread中start方法与run方法的区别
Start方法会调用JVM中的StartThread方法,并通过thread_entry方法去调用run方法。
因此,调用Start方法会创建一个新的子线程并启动,run方法只是Thread一个普通方法的调用。
4.3 Thread 和 Runnable是什么关系
Thread是一个类,而Runnable是一个接口。Thread是一个实现了Runnable接口的类,使run支持多线程。因类的单一继承原则,推荐多使用Runnable接口。
4.4 如何实现处理线程的返回值
1. 主线程等待法
2. 使用Thread类的join()阻塞当前线程以等待子线程处理完毕
3. 通过Callable接口实现:通过FutureTask 或者 线程池获取
4.5 线程的状态
新建(New)∶创建后尚未启动的线程的状态
运行(Runnable):包含Running和Ready
无限期等待(Waiting):不会被分配CPU执行时间,需要显式被唤醒
限期等待(Timed Waiting):在一定时间后会由系统自动唤醒
阻塞(Blocked):等待获取排它锁
结束(Terminated):已终止线程的状态,线程已经结束执行
4.6 Sleep和Wait的区别
sleep是Thread类的方法,wait是Object类中定义的方法
sleep()方法可以在任何地方使用
wait()方法只能在synchronized方法或synchronized块中使用
最主要的本质区别
Thread.sleep只会让出CPU,不会导致锁行为的改变
Object.wait不仅让出CPU,还会释放已经占有的同步资源锁