本次八股记录在求职过程中的所学习及复习的面试问题,按照大纲来整理复习,以及分享给备战八股的各位,大家共同加油,全都有满意的offer!
进程和线程的区别?什么是进程和线程?
进程是正在运行的程序实例,进程中包括了线程,每个线程执行不同的任务。
线程和进程类似,是一个比进程更小的执行单位。
不同的进程使用不同的内存空间,在当前进程下所有线程可以共享内存空间。
线程更轻量,他的上下文切换成本比进程更小,所以我们也可以将其称为轻量级进程。(上下文切换指的是从一个线程切换为另一个线程)
我们可以举例说明:在Java中,当我们启动main函数其实就是启动了一个JVM进程,而main函数所在的线程就是这个进程中的一个线程,也称主线程。
并发和并行的区别?
并发:同一时刻,多个指令在单个CPU下交替执行
并行:同一时刻,多个指令在多个CPU下同时执行
当然肯定会有并发和并行同时存在的情况
这里可以举一个通俗易懂的案例来理解:
家庭主妇做饭、打扫卫生、给孩子喂奶,她一个人轮流交替做这多件事,这时就是并发 家庭主妇雇了个保姆,她们一起这些事,这时既有并发,也有并行(这时会产生竞争,例如锅只有一口,一个人用锅时,另一个人就得等待) 雇了3个保姆,一个专做饭、一个专打扫卫生、一个专喂奶,互不干扰,这时是并行
线程创建的方式?
1.直接继承Thread类
2.实现Runnable接口
3.实现Callable接口
4.线程池的方式创建线程*(后续会详细介绍)
他们的区别:继承Thread类和实现Runnable接口无返回值,而实现Callable接口是有返回值的。
Callable接口可以配合FutureTask获取异步执行的结果
还有一个就是,他们异常处理也不一样,无返回值的实现方式只能够使用Try ... catch 来处理异常,而后者去实现call方法可以直接在方法上抛出异常
既然谈到了线程创建的方式,相比各位也知道开启线程使用的是start() ,那么如果直接使用run方法能否开启一个线程呢?
Start()和Run()的区别?
答案是不能的,因为如果使用run方法去开启一个线程的话,在该线程中只会把他当成一个普通方法去执行,而调用start方法才是开启线程的正确方式,即调用start方法可以启动线程,而直接执行run方法的话不会以多线程方式去执行。
线程中包含哪些状态,如何转换?
新建三个线程,如何保证他们按顺序执行?
使用join方法
当前有三个线程:T1,T2,T3,当我在线程2种加入t1.join()这行代码之后,只有线程1结束之后才会去执行线程2,这样就可以去掌握他们的顺序。
wait和sleep方法有什么不同?
1.方法的归属不同:sleep时Thread类的静态方法,wait则是Object类的成员方法
2.线程的醒来实际不同:sleep方法执行完成之后,线程就会自动苏醒;wait方法需要被notify或notifyAll去唤醒,没有唤醒就会一直等待下去
3.锁特性不同:
如何停止一个正在运行的线程?
可以使用stop去强制中断一个线程,不推荐
也可以使用interrupt方法去中断一个线程,他更加柔和一点,推荐使用!