36、不可变对象对多线程有什么帮助
前面有提到过的一个问题,不可变对象保证了对象的内存可见性,对不可变对象 的读取不需要进行额外的同步手段,提升了代码执行效率。
37、什么是多线程的上下文切换
多线程的上下文切换是指 CPU 控制权由一个已经正在运行的线程切换到另外一个 就绪并等待获取 CPU 执行权的线程的过程。
38、如果你提交任务时,线程池队列已满,这时会发生什么?
这里区分一下:
1、如果使用的是无界队列 LinkedBlockingQueue,也就是无界队列的话,没关 系,继续添加任务到阻塞队列中等待执行,因为 LinkedBlockingQueue 可以近乎 认为是一个无穷大的队列,可以无限存放任务
2、如果使用的是有界队列比如 ArrayBlockingQueue,任务首先会被添加到 ArrayBlockingQueue 中,ArrayBlockingQueue 满了,会根据 maximumPoolSize 的值增加线程数量,如果增加了线程数量还是处理不过来, ArrayBlockingQueue 继续满,那么则会使用拒绝策略 RejectedExecutionHandler 处理满了的任务,默认是 AbortPolicy
39、Java 中用到的线程调度算法是什么?
抢占式。一个线程用完 CPU 之后,操作系统会根据线程优先级、线程饥饿情况等 数据算出一个总的优先级并分配下一个时间片给某个线程执行。
40、什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)?
线程调度器是一个操作系统服务,它负责为 Runnable 状态的线程分配 CPU 时间。 一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。时间分 片是指将可用的 CPU 时间分配给可用的 Runnable 线程的过程。分配 CPU 时间可 以基于线程优先级或者线程等待的时间。线程调度并不受到 Java 虚拟机控制,所 以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优 先级)。