当前位置: 首页 > news >正文

线程相关八股

1. 线程和进程的区别?

进程:进程可以简单理解为进行一个程序,比如说我们打开一个浏览器,打开一个文本,这就是开启了一个进程,一个进程想要在计算机中运行,需要将程序交给CPU,将数据存储在内存中,然后还要在内存和磁盘之间进行一些IO。所以进程就是用来加载指令、管理内存、管理IO的。

线程:线程就是一条条指令流,将这些指令交给CPU就是在运行该线程。一个进程可以有多个线程。

二者区别:进程就是正在运行程序的实例,进程中包含了线程,每个线程执行不同的任务;

                  不同的进程使用不同的内存空间,在当前进程下的所有线程可以共享内存空间;

                  线程更轻量,线程上下文切换成本一般比进程要低。 

2. 并行和并发有什么区别?

在单核CPU下,线程实际上是串行执行的。一般会将这种线程轮流使用CPU的做法叫做并发(concurrent)。

在多核CPU下,每个核都可以调度运行线程,这时候线程可以是并行的。但是对于其中一个核来说,还是串行执行线程的。

并发指的是同一时间应对多件事情的能力;并行指的是同一时间动手做多件事情的能力。

在多核CPU下,并发是指多个线程轮流使用一个或者多个CPU;并行是同一时间动手做多件事情的能力,4核cpu同时处理4个线程。

3.  创建线程的方式有哪些?

继承Thread类,实现runnable接口,实现Callable接口,使用线程池创建线程(一般在项目中使用)。

那使用runnable和callable创建线程的区别是什么呢?

runnable接口的run方法是没有返回值的,而callable接口的call方法是有返回值的,是个泛型,和Future、FutureTask配合使用来获取异步执行的结果;callable接口的call方法允许抛出异常,而runnable接口的run方法的异常只能在内部进行消化即try...catch,不能继续上抛。

线程的run方法和start方法有什么区别?

start是用来启动线程的,通过该线程调用run方法执行run方法中的逻辑代码,start方法只能被调用一次,因为一个线程开启只能开启一次。

而run方法就是一个普通方法封装了代码逻辑,所以可以调用多次

4. 线程包括哪些状态,状态之间是如何变化的?

首先线程包含以下6种运行状态:NEW、RUNNABLE、TIMED_WAITING、WAITING、BLOCKED、TERMINATED。

状态之间的转换:首先,当一个线程被创建时,就为NEW状态,接着运行start方法,但这时CPU可能正在处理其他线程,所以暂时该线程没有执行权,直到抢到了CPU执行权,正常情况下就开始执行线程了,这个中间没有执行权的状态叫做RUNNABLE,当线程结束之后就会进入TERMINATED状态,死亡。以上是正常的执行情况,可能遇到一些异常情况,比如说当线程种使用了锁时,别的线程就拿不到锁,无法执行,进入BLOCKED阻塞状态,直到拿到锁。还有,当执行wait()方法时,线程就进入了WAITING等待状态,直到执行notify()方法,将其唤醒。还有一种是当前线程执行sleep(50)方法,就进入了TIMED_WAITING计时等待状态,等到时间了,就可以执行了。

5. 新建T1、T2、T3三个线程,如何保证他们按顺序执行?

可以使用线程中的join()方法等待线程结束。在如下的例子中,在t2中有一个方法是t1.join,意味着t2只有当t1运行结束之后才会执行,这样就能保证线程间按照顺序执行。

6. notify()和notifyAll()有什么区别?

notifyAll:唤醒所有wait的线程;

notify:只随机唤醒一个wait线程。

7. 在Java中wait和sleep方法的不同点?

共同点:wait()和sleep()的效果都是让当前线程暂时放弃CPU的使用权,进入阻塞状态。

不同点:(1)方法归属不同:sleep是Thread的静态方法;而wait都是成员方法,每个对象都有。

(2)醒来时机不同:sleep和wait的线程都会在等待对应时间后醒来。wait还可以被notify唤醒,但是sleep不可以。他们都可以呗打断唤醒。

(3)锁特性不同:wait方法的调用必须先获取该对象的锁,而sleep不需要;wait方法执行后会释放锁,允许其他线程获取到该锁。而sleep如果在synchronized代码中执行,并不会释放对象的锁。

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

有三种方法可以停止线程:(1) 使用退出标志,使线程正常退出,也就是当run方法执行完后线程终止。(2) 使用stop方法强行终止,但是这种方法已经作废了。(3) 使用interrupt方法中断线程:如果打断阻塞的线程,比如说使用sleep,wait,join方法的线程,线程就会抛出interruptedException异常;如果打断正常的线程,可以根据打断状态来标记是否退出线程。

9. synchronized 关键字的底层原理?

synchronized

相关文章:

  • 【论文分析】语义驱动+迁移强化学习:无人机自主视觉导航的高效解决方案(语义驱动的无人机自主视觉导航)
  • 基于开源库编写MQTT通讯
  • Unity 内置渲染管线各个Shader的用途和性能分析,以及如何修改Shader(build in shader 源码下载)
  • Spring(二)容器
  • 2025年能源工作指导意见
  • 6.C#对接微信Native支付(退款申请、退款回调通知)
  • 分布式中间件:Redis介绍
  • Linux驱动开发之串口驱动移植
  • Android Studio 新版本Gradle发布本地Maven仓库示例
  • The Rust Programming Language 学习 (二)
  • jupyter汉化、修改默认路径详细讲解
  • STM32标准库之编码器接口示例代码
  • Flutter管理项目实战
  • 蓝桥试题:斐波那契数列
  • 【Leetcode 每日一题】1278. 分割回文串 III
  • SpringBoot系列之Spring AI+DeekSeek创建AI应用
  • 【每日八股】计算机网络篇(二):TCP 和 UDP
  • 虚拟机配置
  • ThreadLocal的Key是弱引用给垃圾回收带来的问题
  • 深入探究Python机器学习算法:无监督学习(聚类算法如 K-Means、DBSCAN,降维算法如 PCA、SVD)
  • 上海灵活就业人员公积金新政有哪些“创新点”?
  • 国家卫健委:工作相关肌肉骨骼疾病、精神和行为障碍成职业健康新挑战
  • 中公教育薪酬透视:董监高合计涨薪122万,员工精简近三成
  • 全球前瞻|王毅赴巴西出席金砖外长会,加拿大迎来“几十年来最重要大选”
  • 黄永年:说狄仁杰的奏毁淫祠
  • 视觉周刊|2025上海车展的科技范