• 线程池、及使用场景、线程安全封装、ConcurrentHashMap应用场景


    https://blog.csdn.net/sinbadfreedom/article/details/80467253     :1.HashMap与ConcurrentHashMap的区别与应用场景

    https://www.jianshu.com/p/b9429d7737c4              :封装线程安全类的一些手段

    ★ 线程池的各种使用场景

    (1)高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换
    (2)并发不高、任务执行时间长的业务要区分开看:
           a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以加大线程池中的线程数目,让CPU处理更多的业务
           b)假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)一样吧,线程池中的线程数设置得少一些,减少线程上下文的切换
    (3)并发高、业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构的设计,看看这些业务里面某些数据是否能做缓存是第一步,增加服务器是第二步,至于线程池的设置,设置参考(2)。最后,业务执行时间长的问题,也可能需要分析一下,看看能不能使用中间件对任务进行拆分和解耦。

    ★ Java里面线程池  顶级接口:Executor (但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService):

    比较重要的几个类:

    ExecutorService

    真正的线程池接口。

    ScheduledExecutorService

    能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。

    ThreadPoolExecutor

    ExecutorService的默认实现。

    ScheduledThreadPoolExecutor

    继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。

    要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

    1. newSingleThreadExecutor

    创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

    2.newFixedThreadPool

    创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

    3. newCachedThreadPool

    创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,

    那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

    4.newScheduledThreadPool

    创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

    代码实例:https://www.cnblogs.com/kaffeetrinken/p/8548549.html  https://blog.csdn.net/johnf_nash/article/details/81369235

  • 相关阅读:
    FineReport: 参数为空选出全部值(按条件查询,空条件时直接过滤,不进行查询。。)
    BarManager菜单栏加载与菜单项点击事件详解|devExpress教程
    BarManager菜单栏加载与菜单项点击事件详解|devExpress教程
    C# 判断类型间能否隐式或强制类型转换,以及开放泛型类型转换 update
    C# 判断类型间能否隐式或强制类型转换,以及开放泛型类型转换 update
    Devexpress Chart series 点击时获取SeriesPoint的值
    Devexpress Chart series 点击时获取SeriesPoint的值
    IndexOf()、IndexOfAny()的用法 —— c#
    IndexOf()、IndexOfAny()的用法 —— c#
    Java并发问题乐观锁与悲观锁以及乐观锁的一种实现方式CAS
  • 原文地址:https://www.cnblogs.com/hahajava/p/9642897.html
Copyright © 2020-2023  润新知