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)。