每日十题八股-2024年12月11日

1.核心线程数设置为0可不可以?

2.线程池种类有哪些?

3.线程池一般是怎么用的?

4.线程池中shutdown (),shutdownNow()这两个方法有什么作用?

5.提交给线程池中的任务可以被撤回吗?

6.多线程打印奇偶数,怎么控制打印的顺序

7.JVM的内存模型介绍一下

8.JVM内存模型里的堆和栈有什么区别?

9.栈中存的到底是指针还是对象?

10.堆分为哪几部分呢?

1.核心线程数设置为0可不可以?

可以。但是效率肯定是变得很低的。

来了一个任务之后,会先将任务添加到任务队列,同时也会判断当前工作的线程数是否为 0,如果为 0,则会创建线程来执行线程池的任务。

2.线程池种类有哪些?

ScheduledThreadPool:可以设置定期的执行任务,它支持定时或周期性执行任务。

FixedThreadPool:它的核心线程数和最大线程数是一样的,除了初始化时线程数0,其他时候线程数是固定的。

CachedThreadPool:可以称作可缓存线程池,它的特点在于线程数是几乎可以无限增加的。实际不存储任何任务,它只负责对任务进行中转和传递,所以效率比较高。

SingleThreadExecutor:它会使用唯一的线程去执行任务。

SingleThreadScheduledExecutor。

3.线程池一般是怎么用的?

首先不建议使用Executor提供的newFixedThreadPool和newCachedThreadPool。应该根据项目的场景和需求预估参数,如最大线程数,核心线程数,拒绝策略等来new ThreadPoolExecutor()。任何时候,都应该为自定义线程池指定有意义的名称,以方便排查问题。同时应该使用监控手段来观察线程池的状态。

4.线程池中shutdown (),shutdownNow()这两个方法有什么作用?

1、当创建线程池后,初始时,线程池处于RUNNING状态,此时线程池中的任务为0;

2、如果调用了shutdown()方法,则线程池处于SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕;

3、如果调用了shutdownNow()方法,则线程池处于STOP状态,此时线程池不能接受新的任务,并且会去首先会给所有线程池中的线程发送 interrupt 中断信号,尝试中断这些任务的执行,然后会将任务队列中正在等待的所有任务转移到一个 List 中并返回;

4、当所有的任务已终止,ctl 记录的"任务数量"为0,线程池会变为TIDYING状态。接着会执行terminated()函数;

5、线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED,线程池被设置为TERMINATED状态。

5.提交给线程池中的任务可以被撤回吗?

可以,当向线程池提交任务时,会得到一个Future对象。这个Future对象提供了几种方法来管理任务的执行,包括取消任务。取消任务的主要方法是Future接口中的cancel(boolean mayInterruptIfRunning)方法。参数mayInterruptIfRunning指示是否允许中断正在执行的任务。如果设置为true,则表示如果任务已经开始执行,那么允许中断任务;如果设置为false,任务已经开始执行则不会被中断。

6.多线程打印奇偶数,怎么控制打印的顺序?

Object的wait/notify方式。

题目集合,认真看:https://cloud.tencent.com/developer/article/2030013

7.JVM的内存模型介绍一下

Java 的内存模型(JMM)。

Java 内存模型(Java Memory Model,JMM)定义了 Java 程序中的变量、线程如何和主存以及工作内存进行交互的规则。它主要涉及到多线程环境下的共享变量可见性、指令重排等问题,是理解并发编程中的关键概念。Java 使用的是共享内存并发模型。

JVM 运行时内存共分为堆、元空间、虚拟机栈、本地方法栈、程序计数器五个部分。其中堆和元空间是线程之间共享的。
堆: JVM 所有线程共享的部分,在虚拟机启动的时候就已经创建。这部分空间可通过 GC 进行回收。

**元空间:**元空间并不在虚拟机中,而是使用本地内存。

**虚拟机栈:**线程私有,栈里面存着的是一种叫"栈帧"的东西,每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等信息。

**本地方法栈:**与虚拟机栈类似,区别是虚拟机栈执行Java方法,本地方法站执行native方法。

**程序计数器:**程序计数器可以看成是当前线程所执行的字节码指令的行号指示器。每条线程都需要一个独立的程序计数器,为了线程切换后能恢复到正确的执行位置。

**直接内存:**直接内存并不是虚拟机运行时数据区的一部分,也不是Java 虚拟机规范中定义的内存区域。

8.JVM内存模型里的堆和栈有什么区别?

9.栈中存的到底是指针还是对象?

在JVM内存模型中,栈(Stack)主要用于管理线程的局部变量和方法调用的上下文,而堆(Heap)则是用于存储所有类的实例和数组。

指针,或者说是引用。

当我们在栈中讨论"存储"时,实际上指的是存储基本类型的数据(如int, double等)和对象的引用,而不是对象本身。

10.堆分为哪几部分呢?

新生代(Young Generation),老年代(Old Generation/Tenured Generation),大对象区(Large Object Space / Humongous Objects)。

相关推荐
都叫我大帅哥38 分钟前
深入浅出 Resilience4j:Java 微服务的“免疫系统”实战指南
java·spring cloud
Cao_Shixin攻城狮3 小时前
Flutter运行Android项目时显示java版本不兼容(Unsupported class file major version 65)的处理
android·java·flutter
Dcs5 小时前
还在用 Arrays.hashCode?Java 自己也能写出更快的版本!
java
fouryears_234177 小时前
Spring,Spring Boot 和 Spring MVC 的关系以及区别
java·spring boot·spring·mvc
阿葱(聪)8 小时前
java 在k8s中的部署流程
java·开发语言·docker·kubernetes
浮生带你学Java8 小时前
2025Java面试题及答案整理( 2025年 7 月最新版,持续更新)
java·开发语言·数据库·面试·职场和发展
板板正8 小时前
SpringAI——提示词(Prompt)、提示词模板(PromptTemplate)
java·spring boot·ai·prompt
板板正8 小时前
SpringAI——对话记忆
java·spring boot·ai
期待のcode9 小时前
图片上传实现
java·前端·javascript·数据库·servlet·交互
李长渊哦9 小时前
深入理解Java中的Map.Entry接口
java·开发语言