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

相关推荐
渣哥13 分钟前
原来 Java 里线程安全集合有这么多种
java
间彧21 分钟前
Spring Boot集成Spring Security完整指南
java
间彧44 分钟前
Spring Secutiy基本原理及工作流程
java
Java水解2 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆4 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学4 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole4 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊5 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端
程序员鱼皮5 小时前
刚刚 Java 25 炸裂发布!让 Java 再次伟大
java·javascript·计算机·程序员·编程·开发·代码