每日十题八股-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)。

相关推荐
咖啡教室5 小时前
java日常开发笔记和开发问题记录
java
咖啡教室5 小时前
java练习项目记录笔记
java
鱼樱前端5 小时前
maven的基础安装和使用--mac/window版本
java·后端
RainbowSea6 小时前
6. RabbitMQ 死信队列的详细操作编写
java·消息队列·rabbitmq
RainbowSea6 小时前
5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
java·消息队列·rabbitmq
李少兄8 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
此木|西贝8 小时前
【设计模式】原型模式
java·设计模式·原型模式
可乐加.糖8 小时前
一篇关于Netty相关的梳理总结
java·后端·网络协议·netty·信息与通信
s9123601018 小时前
rust 同时处理多个异步任务
java·数据库·rust
9号达人8 小时前
java9新特性详解与实践
java·后端·面试