多线程基础面试题

本文详细解释了进程、线程的概念及其区别,探讨了并发与并行的不同,介绍了Java中创建线程的方式,守护线程的作用,多线程的优缺点以及如何控制线程运行、等待和同步。此外,还对比了sleep和yield方法以及synchronized关键字的使用。
摘要由CSDN通过智能技术生成

多线程基础面试题

1. 什么是进程?什么是线程?

参考答案

    线程是处理器任务调度和执行的基本单位,进程是操作系统资源分配的基本单位。
    进程是程序的一次执行过程,是系统运行的基本单位。线程是一个比进程更小的执行单位,一个进程可以包含多个线程。

2. 进程和线程区别?

参考答案

 
地址空间资源并发性切换
进程进程之间是独立的地址空间进程之间的资源是独立的,能很好的进行资源管理和保护可并发执行进程切换时,消耗的资源大,效率低。
线程线程共享本进程的地址空间线程共享本进程的资源如内存、I/O、cpu 等,不利于资源的管理和保护可并发执行线程切换时,消耗的资源小,效率高。

3. 什么是并发?什么是并行?

参考答案

    并发:指应用能够交替执行不同的任务。
    并行:指应用能够同时执行不同的任务。
    两者区别:并发是交替执行,并行是同时执行。

4. Java 中实现线程方式?

参考答案

    1. 继承 Thread 类
    2. 实现 Runnable 接口
    3. 实现 Callable 接口

5. 守护线程和普通线程区别?

参考答案

    守护线程与普通线程的唯一区别是:当 JVM 中所有的线程都是守护线程的时候,JVM 就可以退出了;如果还有一个或以上的非守护线程则不会退出。

6. 多线程优缺点?

参考答案

    优点:当一个线程进入等待状态或者阻塞时,CPU 可以先去执行其他线程,提高 CPU 的利用。
    缺点:
    1. 上下文切换:频繁的上下文切换会影响多线程的执行速度。
    2. 不恰当的编程有可能会出现死锁
    3. 资源限制:在进行并发编程时,程序的执行速度受限于计算机的硬件或软件资源。在并发编程中,程序执行变快的原因是将程序中串行执行的部分变成并发执行,如果因为资源限制,并发执行的部分仍在串行执行,程序执行将会变得更慢,因为程序并发需要上下文切换和资源调度。

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

参考答案

    1. stop():已废弃。stop 方法存在线程安全问题,会破坏线程的原子性。
    2. interrupt(): Interrupt 不会真的中止线程,只是给线程加上了一个标识,即 isInterrupted 从 false 变成了 true;要是线程处于 waiting 状态,再调用 Interrupt 会清除线程的阻塞状态,使线程状态变为 runnable,而且 isInterrupted 也会从 true 变回 false。
    3. 使用标志位

8. runnable 和 callable 区别?

参考答案

    相同点:
        两者都是接口
        两者都需要调用 start() 启动线程
    不同点:
        callable 的核心是 ca11() 方法,允许返回值,runnable 的核心是 run() 方法,没有返回值
        ca11() 方法可以抛出异常,但是 run() 方法不行

9. run 和 start 区别?

参考答案

    线程是通过 Thread 对象所对应的方法 run() 来完成其操作的,而线程的启动是通过 start() 方法执行的。
    run() 方法可以重复调用,start() 方法只能调用一次。

10. sleep 和 wait 区别?

参考答案

    1. sleep 是线程中的方法,但是 wait 是 Object 中的方法。
    2. sleep 方法不会释放 lock,但是 wait 会释放,而且会加入到等待队列中。
    3. sleep 方法不依赖于同步器 synchronized,但是 wait 需要依赖 synchronized 关键字。
    4. sleep 不需要被唤醒(休眠之后退出阻塞),但是 wait 需要(不指定时间需要被别人中断)。

11. synchronized 关键字的使用方式?

参考答案

    synchronized 有三种方式来加锁,分别是:
    1. 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁
    2. 静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁
    3. 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

12. 线程的 sleep() 方法和 yield() 方法有什么不同?

参考答案

    1.  s1eep() 方法会使得当前线程暂停指定的时间,没有消耗 CPU 时间片。
    2.  sleep()使得线程进入到阻塞状态,yield() 只是对 CPU 进行提示,如果 CPU 没有忽略这个提
示,会使得线程上下文的切换,进入到就绪状态。
    3. sleep() 一定会完成给定的休眠时间,yield() 不一定能完成。
    4. sleep() 需要抛出 InterruptedException,而 yield() 方法无需抛出异常。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

师范大学通信大怨总

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值