Java八股文之多线程篇

本次八股记录在求职过程中的所学习及复习的面试问题,按照大纲来整理复习,以及分享给备战八股的各位,大家共同加油,全都有满意的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方法的话不会以多线程方式去执行。

线程中包含哪些状态,如何转换?

JDK 中的 Thread 类中的枚举 State 里面定义了 6种 线程的状态分别是:新建、可运行、终止、阻塞、等待和超时等待六种。
当一个线程对象被创建,但还未调用 start 方法时处于新建 状态,调用了 start 方法,就会由新建 进入 可运行 状态。
如果线程内代码已经执行完毕,由可运行状态进入 终止 状态。当然这些是一个线程正常执行情况
如果线程获取锁失败,由 可运行状态 进入 阻塞状态 ,只有当获得到锁时, 进入可运行 状态
如果线程调用了 wait() 方法,就会从 可运行状态进入等待 状态,当其它持锁线程调用 notify() notifyAll() 方法,会恢复为可运行 状态
还有一种情况是调用 sleep() 方法会从 可运行 状态进入 超时等待 状态,不需要主动唤醒,超时时间到自然恢复为可运行 状态

新建三个线程,如何保证他们按顺序执行?

使用join方法

当前有三个线程:T1,T2,T3,当我在线程2种加入t1.join()这行代码之后,只有线程1结束之后才会去执行线程2,这样就可以去掌握他们的顺序。

wait和sleep方法有什么不同?

1.方法的归属不同:sleep时Thread类的静态方法,wait则是Object类的成员方法

2.线程的醒来实际不同:sleep方法执行完成之后,线程就会自动苏醒;wait方法需要被notify或notifyAll去唤醒,没有唤醒就会一直等待下去

3.锁特性不同:

wait 方法的调用必须先获取 wait 对象的锁,而 sleep 则无此限制
wait 方法执行后会释放对象锁,允许其它线程获得该对象锁(相当于我放弃
cpu ,但你们还可以用)
sleep 如果在 synchronized 代码块中执行,并不会释放对象锁(相当于我
放弃 cpu ,你们也用不了)

如何停止一个正在运行的线程?

可以使用stop去强制中断一个线程,不推荐

也可以使用interrupt方法去中断一个线程,他更加柔和一点,推荐使用!

  • 31
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值