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

相关推荐
“抚琴”的人1 分钟前
C#—泛型约束
java·开发语言·c#
qq_459388712 分钟前
C++作业5
java·c++·算法
Sombra_Zhang11 分钟前
Java简介:打开通往变成世界的大门
java·开发语言
幽兰的天空24 分钟前
Java 基础之 XQuery:强大的 XML 查询语言
java·运维·数据库
不能只会打代码24 分钟前
Java多线程与线程池技术详解(九)
java·开发语言·java线程池·多线程与线程池
灰色人生qwer38 分钟前
使用 java -jar 命令启动 Spring Boot 应用时,指定特定的配置文件的几种实现方式
java·spring boot·jar
sagima_sdu1 小时前
Python 程序与 Java 系统集成:通过 FastAPI 实现 HTTP 接口
java·python·fastapi
烬奇小云1 小时前
基于Dockerfile的博客管理系统的容器化部署
java·sql·mysql·spring
液态不合群1 小时前
[Java] Stream流使用最多的方式
java·windows·python
阿哈831 小时前
A6481 基于Java+mysql+Vue+MySQL+uni-app在线商城系统微信小程序的设计与实现 配置 源码 全套资料
java·vue.js·mysql·微信小程序·uni-app