-
并发与多线程面试路线最全整理(附面试题精选及答案)
并发与多线程面试路线最全整理,附并发与多线程高频必考面试题及答案。 搞定并发与多线程面试题,看这一篇就够了,不用四处找资料,节约大量时间。 1 并发与多线程面试题及答案 Java中的锁是什么 什么是轻量级锁 什么是偏向锁 什么是读写锁 什么是自旋锁 什么是锁消除 什么是活锁和饥饿 什么是无锁 什么是重入锁(ReentrantLock) 乐观锁与悲观锁是什么 什么是锁粗化 什么是死锁 怎么避免…... -
并发与多线程学习进阶路线及资料(附大厂面试题合集)
在 Java 面试中,并发和多线程出现的概率几乎是 100%。 如果你想跳槽涨薪,又或想进大厂,并发和多线程都是必知必会的知识。 但是,并发和多线程的知识点纷繁复杂,有一定的学习难度,那我们要如何才能学好它呢? 想要深入学习并发与多线程 ,就要先了解并发与多线程的知识体系。 我最新总结的这份并发与多线程学习进阶路线及资料,包含了并发与多线程的所有核心知识点,可以用来参考学习、构建知识体系、复盘技术…... -
怎么让3个线程按顺序执行
参考答案 1. 让线程按顺序运行的方法 涉及到多线程中许多常用的方法,总结如下: 使用线程的join方法 使用主线程的join方法 使用线程的wait方法 使用线程的线程池方法 使用线程的Condition(条件变量)方法 使用线程的CountDownLatch(倒计数)方法 使用线程的CyclicBarrier(回环栅栏)方法 使用线程的Semaphore(信号量)方法 2. 让线程按顺序…... -
启动一个线程是用start还是run方法
参考答案 启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态。这意味着它可以由JVM调度并执行,但并不意味着线程就会立即运行。 run()方法可以产生必须退出的标志来停止一个线程。 一、run方法运行结果 run()方法只是类的一个普通方法,如果直接调用run()方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完…... -
线程中断与stop的区别
参考答案 线程中断与stop的区别: public final void stop(): 让线程停止,方法过失了,但还可以用。 public void interrupt(): 中断线程,并抛出InterruptedException,程序正常结束。 线程中断与stop的实例: public class ThreadSleepDemp { public static void main(Strin…... -
如何保证多个线程同时启动
参考答案 保证多个线程同时启动,可以 wait()、notify() 实现,也可以使用发令枪 CountDownLatch 实现。 CountDownLatch 实现较简单,实例: public class TestCountDownLatch { private static CountDownLatch cld = new CountDownLatch(10); public static v…... -
如何让一个线程休眠
参考答案 可以使用sleep()方法。 一、线程休眠 sleep sleep() 方法定义在Thread.java中,是 static 修饰的静态方法。 sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。 …... -
线程包括哪些状态,状态之间是如何变化的
参考答案 一、线程的生命周期 线程包括哪些状态的问题说专业一点就是线程的生命周期。 不同的编程语言对线程的生命周期封装是不同的。 二、Java 中线程的生命周期 Java 语言中线程共有六种状态。 NEW(初始化状态) RUNNABLE(可运行 / 运行状态) BLOCKED(阻塞状态) WAITING(无限时等待) TIMED_WAITING(有限时等待) TERMINATED(终止状态) 在操…... -
线程的优先级有什么用
参考答案 线程的优先级: Java中线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级。 Java中的线程优先级具有继承的特性。例如,线程1启动线程2,那么线程2的优先级就和线程1的优先级是一样的。 设置线程优先级,有助于帮助线程规划器确定下一次选中哪一个线程优先执行。 优先级高的线程得到的CPU资源比较多,也就是CPU优先执行优先级高的线程对象中的任务。 线程的优先级…... -
Java程序中怎么保证多线程的运行安全
参考答案 线程的安全性问题如下: 原子性:一个或者多个操作在 CPU 执行的过程中不被中断的特性; 可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到; 有序性:程序执行的顺序按照代码的先后顺序执行。 导致线程的安全性问题的原因: 缓存导致的可见性问题; 线程切换带来的原子性问题; 编译优化带来的有序性问题。 多线程运行安全的解决办法: JDK Atomic开头的原子类、synchroni…... -
如何停止一个线程
参考答案 1. 如何让线程 A 终止线程 B Java 中 Thread 类有一个 stop() 方法,可以终止线程,但是该方法会让线程直接终止,在执行的任务立即终止,未执行的任务无法反馈,因此不建议使用stop() 方法。 2. 有没有更好的方式结束线程 线程只有从 runnable 状态(可运行/运行状态),才能进入terminated 状态(终止状态)。 如果线程处于 blocked、w…... -
如何创建、启动 Java 线程
参考答案 Java 中创建线程的4种常见方式: 一、重写 Thread 类的 run() 方法 有两种表现形式: 1. new Thread 对象匿名重写 run() 方法 public class TestNewThread { public static void main(String[] args) { //创建线程 t, 重写 run() 方法 new Thread("t&…... -
什么是守护线程
参考答案 Java线程分为用户线程和守护线程。 守护线程:是程序运行的时候在后台提供一种通用服务的线程。所有用户线程停止,进程会停掉所有守护线程,退出程序。 Java中把线程设置为守护线程的方法:在 start 线程之前调用线程的 setDaemon(true) 方法。 注意: setDaemon(true) 必须在 start() 之前设置,否则会抛出IllegalThreadStateExce…... -
阿里为什么不让用Executors创建线程池
参考答案 阿里巴巴开发手册并发编程中的一条规则:线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式。 1. 主要原因 FixedThreadPool和SingleThreadExecutor => 允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而引起OOM异常。 CachedThreadPool => 允许创建…... -
Executors创建线程池有哪几种方式
参考答案 1. 关于Executors类 Executors 类是从 JDK 1.5 开始就新增的线程池创建的静态工厂类,用来创建线程池的。 但是,现在很多大厂已经不建议使用该类去创建线程池。原因在于,该类创建的很多线程池的内部使用了无界任务队列,在并发量很大的情况下会导致 JVM 抛出 OutOfMemoryError,直接让 JVM 崩溃,影响严重。 2. Executors 类的使用方法…... -
线程池包含哪些状态
参考答案 1. 线程池5种状态 1.1 RUNNING 线程池一旦被创建,就处于 RUNNING 状态,任务数为 0,能够接收新任务,对已排队的任务进行处理。 1.2 SHUTDOWN 不接收新任务,但能处理已排队的任务。调用线程池的 shutdown() 方法,线程池由 RUNNING 转变为 SHUTDOWN 状态。 1.3 STOP 不接收新任务,不处理已排队的任务,并且会中断…... -
线程池中submit和execute有什么区别
参考答案 线程池中submit和execute的区别: execute() 参数 Runnable ;submit() 参数 (Runnable) 或 (Runnable 和 结果 T) 或 (Callable)。 execute() 没有返回值;而 submit() 有返回值。 submit() 的返回值 Future 调用get方法时,可以捕获处理异常。 以上,是Java面试题【线程池subm…... -
如何关闭线程池
参考答案 1. 关闭线程池的两个方法 shutdownNow:线程池拒接收新提交的任务,同时立马关闭线程池,线程池里的任务不再执行。 shuwdown:线程池拒接收新提交的任务,同时等待线程池里的任务执行完毕后关闭线程池。 2. 两个关闭线程池方法的源码详解 下面结合线程池源码,分别说说这两个线程池关闭方法的一些实现细节。 2.1 shutdownNow shutdownNow方法的源码:…... -
如何设置线程池的大小
参考答案 使用利特尔法则(Little's law)来判定线程池大小。 一个系统请求数等于请求的到达率与平均每个单独请求花费的时间之乘积 假设服务器单核的,对应业务需要保证请求量(QPS):10 ,真正处理一个请求需要 1 秒,那么服务器每个时刻都有 10 个请求在处理,即需要 10 个线程。 使用利特尔法则(Little’s law)来判定线程池大小,我们只需计算请求到达率和请求处理的…... -
如何查看线程池的运行状态
参考答案 在实际开发中,使用线程池的过程可能会遇到各方面的故障,例如线程池阻塞、无法提交新任务等。 如果想要监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 给出了相关的 API,能实时获取线程池的当前活动线程数、正在排队中的线程数、已经执行完成的线程数、总线程数等。 总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数。 线程池使用实例: private …... -
如何提交一个线程到线程池
参考答案 1. Java创建线程有三种基本方法 1. 继承Thread类 2. 实现Runnable接口(推荐的实现方式) 3. 实现Callable接口实现Java多线程 2. 详解Java创建线程的三种基本方法 2.1 继承Thread类,然后重写Thread 的run()方法 基本语法格式为public MyThread extends Thread { @Override pu…... -
为什么不推荐使用stop停止线程
参考答案 不推荐使用stop停止线程的原因:线程启动完毕后,在运行时可能需要终止。 虽然Java提供的终止方法只有一个stop,但是却不建议使用这个方法。因为使用stop停止线程,有以下三个问题: stop方法是过时的从Java编码规则来说,已经过时的方法不建议采用。 stop方法会导致代码逻辑不完整stop方法是一种“恶意”的中断,一旦执行stop方法,即终止当前正在运行的线程,不管线程逻辑是否…... -
Java里面有哪些内置的线程池
参考答案 Java 通过 Executors 提供四种线程池: newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。…... -
线程池的拒绝策略有哪几种
参考答案 当线程池的任务缓存队列已满,且线程池中的线程数目达到maximumPoolSize时,如果还有任务到来就会采取任务拒绝策略。 线程池的拒绝策略通常有以下四种: 1. AbortPolicy 丢弃任务并抛出RejectedExecutionException异常。这是线程池默认的拒绝策略,在任务不能再提交的时候,抛出异常,及时反馈程序运行状态。 如果是比较关键的业务,推荐使用此拒绝策略,…...