问题一:线程处理任务的过程是啥?
线程处理任务的过程是啥?
参考回答:
过程如下:
当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务。
当线程池达到corePoolSize时,新提交任务将被放入workQueue中等待执行。
当workQueue已满,且maximumPoolSize大于corePoolSize时,新提交任务会创建新线程执行任务。
当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理。
当线程池中超过corePoolSize的线程空闲时间达到keepAliveTime时,关闭空闲线程。
关于本问题的更多回答可点击原文查看:
https://developer.aliyun.com/ask/633964
问题二:线程池中的拒绝策略有哪些?
线程池中的拒绝策略有哪些?
参考回答:
拒绝策略包括:
AbortPolicy:直接抛出异常,阻止系统正常运行。
CallerRunsPolicy:在调用者线程中运行当前被丢弃的任务。
DiscardOldestPolicy:丢弃队列中最老的任务,并尝试再次提交当前任务。
DiscardPolicy:默默地丢弃无法处理的任务。
关于本问题的更多回答可点击原文查看:
https://developer.aliyun.com/ask/633966
问题三:Execuors类提供了哪些实现线程池的方法?
Execuors类提供了哪些实现线程池的方法?
参考回答:
newSingleThreadExecutor():创建一个单线程线程池。
newCachedThreadPool():创建一个可缓存的线程池。
newFixedThreadPool():创建一个固定大小的线程池。
newScheduledThreadPool():创建一个支持定时及周期性任务的线程池。
newWorkStealingPool():创建一个工作窃取线程池。
关于本问题的更多回答可点击原文查看:
https://developer.aliyun.com/ask/633967
问题四:为什么手动创建的线程池比使用Executors类提供的线程池更安全?
为什么手动创建的线程池比使用Executors类提供的线程池更安全?
参考回答:
手动创建的线程池底层通常使用ArrayBlockingQueue等有限队列,可以防止任务队列无限制增长导致的OOM(内存溢出)。而Executors类提供的某些线程池(如FixedThreadPool和CachedThreadPool)使用无界队列,可能会因为任务队列无限增长而消耗过多内存,导致OOM。因此,手动创建的线程池更安全。
关于本问题的更多回答可点击原文查看:
https://developer.aliyun.com/ask/633968
问题五:乐观锁是什么,以及它在Java中是如何实现的?
乐观锁是什么,以及它在Java中是如何实现的?
参考回答:
乐观锁是一种积极的并发控制策略,它总是假设数据不会被其他事务修改,因此不会对数据进行加锁。在Java中,乐观锁的实现方式主要有两种:版本号机制和CAS(Compare and Swap)。例如,java.util.concurrent.atomic包下的原子变量类就是使用了CAS实现的乐观锁。
关于本问题的更多回答可点击原文查看: