【Java进阶营】java面试题---线程

本文详细探讨了线程的定义、进程区别、用户线程与守护线程、守护线程设置、创建方式、生命周期、优先级调整、线程调度算法,以及线程通信、同步与互斥、同步实现方式、run与start方法差异,最后涉及Servlet线程安全性和常用工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什么是线程,线程和进程有什么区别?

    线程是程序的最小执行单元;进程是在内存中运行的应用程序,一个进程可能包含若干个线程。

2. 什么是用户线程,什么是守护线程?

    用户线程就是运行在前台执行具体任务的线程;守护线程就是运行在后台为其他线程提供基础服务的,比如GC所在的线程。

3. 如何创建守护线程?

    可以通过线程 start 之前调用 setDeamon(true) 方法来把线程设置为守护线程。

4. 守护线程有什么特点?

    一旦所有的用户线程结束,守护线程会随着 JVM 一起结束工作,所以守护线程中的 finally 块不一定执行;
    守护线程中创建的新线程也是守护线程。

5. 创建线程有哪些方式?

    继承 Thread 类;
    实现 Runnable 接口;
    实现 Callable 接口;
    通过线程池获取。

6. 说一说线程的生命周期。

被创建 ---> 就绪 ---> 运行 ---> 阻塞 ---> 死亡。

    被创建是线程刚被 new 出来;
    就绪就是调用了 start 方法等待 cpu 的执行权;
    运行就是就绪状态的线程获得了 cpu 时间片;
    阻塞就是运行状态的线程由于某些原因放弃了 cpu 的执行权;
    死亡就是线程正常或者异常结束,退出了 run 方法,线程就死亡了,死亡的线程不能复生。

7. 你知道线程怎么设置优先级吗?

    线程默认优先级是 5,可以通过 setPriority 方法设置,范围是 1 ~ 100。

8. 什么是线程调度器?

    是一个操作系统服务,负责为就绪状态的线程分配 CPU 时间,就绪状态的线程必须依赖线程调度器才能获得执行权。

9. 什么叫时间分片?

    将可用的 cpu 时间分配给就绪状态的线程的过程。

10. 你知道哪些线程调度算法?

常见的有分时调度和抢占式调度两种算法。

    分时调度就是让线程轮流获得 CPU 的执行权,并且平均分配每个线程的时间片;
    抢占式调度就是可以为线程设置优先级,优先级高的优先获得执行权,优先级相同的随机选择一个线程执行,JVM 采用的就是这种调度方式。

11. 哪些情况下线程会终止?

    时间片用完;
    优先级更高的线程出现;
    IO 操作受阻;
    调用 sleep 方法进入了休眠状态;
    调用 yield 让出了 CPU 执行权。

12. 线程间怎么通信?

    wait 和 notify;
    await 和 signal;
    park 和 unpark。

13. 什么是线程的同步和互斥?

    线程的互斥就是操作共享数据时的排他性,共享数据在同一时刻只能被一个线程操作;
    线程的同步是在互斥的基础上,通过一些机制来实现多个线程对资源的有序访问。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

14. 有哪些方式来实现线程的同步?

    临界区:通过对多线程的串行化来访问公共资源或一段代码;
    互斥对象:只有拥有互斥对象的线程才有访问公共资源的权限;
    信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目;
    事件对象:通过通知的方式来保持线程的同步。

15. java 中实现线程同步的方式有哪些?

    同步方法、同步代码块、volatile、并发包中的 Lock、ThreadLocal、阻塞队列、原子变量。

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

    调用 run 方法相当于在当前线程调用了一个普通的方法,并不会创建新线程,调用 start 方法才会创建新线程。

17. 用过 wait 和 notify 吗,说说你对它们的了解?

    wait 和 notify 可以实现线程间的等待唤醒。它们被定义在 Object 类中,因为任意对象都能做锁对象,而 wait 和 notify 就是被锁对象调用的,为了能被任意对象调用,所以只能定义在 Object 类中。wait 和 notify 被调用的前提是持有锁,所以一定得在同步代码块或者同步方法中调用。wait 的时候一定要用 while 循环去判断,不能用 if,否则可能会收到虚假唤醒。

18. yield 方法有什么作用?

    yield 方法是当前线程让出自己的执行权,重新进入就绪状态,当然进入就绪状态后也有可能又是自己抢到了执行权。

19. servlet 线程是否安全?

    servlet 单例多线程,线程不安全;
    struts 多实例多线程,线程安全;
    springMVC 单实例多线程,线程不安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值