线程是进程划分成的更小的运行单位,一个进程包含多个线程
一、虚拟机栈和本地方法栈为什么是私有的?
为了保证线程中的局部变量不被别的线程访问到
二、程序计数器为什么是私有的?
程序计数器私有主要是为了线程切换后能恢复到正确的执行位置。
三、一句话简单了解堆和方法区
堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象 (几乎所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
四.说说并发与并行的区别
并发:同一个时间段内,只有一条指令执行
并行:同一时间端内,可以有多个指令执行
(多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行)
五.什么是上下文切换?
(线程A开始停止执行,切换到另一个线程开始执行的过程)
多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。
六、为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?
调用 start() 方法方可启动线程并使线程进入就绪状态,直接执行 run() 方法的话不会以多线程的方式执行。
七.为什么要用线程池?
- 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
- 提高线程的可管理性。使用线程池可以进行统一的分配,调优和监控
八.实现 Runnable 接口和 Callable 接口的区别
Callable更高级一点,可以有返回结果和抛出异常,而前者不可以
九… 执行 execute()方法和 submit()方法的区别是什么呢
- execute()方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功与否;
- submit()方法用于提交需要返回值的任务。线程池会返回一个 Future 类型的对象,通过这个 Future 对象可以判断任务是否执行成功
十为什么要使用多线程呢?
提高并发能力。