• 创建线程池注意、自定义线程池


    1、

    创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。

    创建线程池的时候请使用带ThreadFactory的构造函数,并且提供自定义ThreadFactory实现或者使用第三方实现

    ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
    .setNameFormat("demo-pool-%d").build();
    ExecutorService singleThreadPool
    = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy()); singleThreadPool.execute(()-> System.out.println(Thread.currentThread().getName())); singleThreadPool.shutdown(); public class TimerTaskThread extends Thread { public TimerTaskThread(){ super.setName("TimerTaskThread"); … }

    2、

    线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

    说明:Executors返回的线程池对象的弊端如下:

    1)FixedThreadPool和SingleThreadPool:
      允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
    2)CachedThreadPool:
      允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。

    Positive example 1:


    //
    org.apache.commons.lang3.concurrent.BasicThreadFactory ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1, new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());



    Positive example 2:


    ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() .setNameFormat("demo-pool-%d").build();
    //Common Thread Pool ExecutorService pool = new ThreadPoolExecutor(5, 200, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1024),
    namedThreadFactory,
    new ThreadPoolExecutor.AbortPolicy());
    pool.execute(()
    -> System.out.println(Thread.currentThread().getName())); pool.shutdown();//gracefully shutdown

    Positive example 3:

    <bean id="userThreadPool"
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="10" />
    <property name="maxPoolSize" value="100" />
    <property name="queueCapacity" value="2000" />
    
    <property name="threadFactory" value= threadFactory />
    <property name="rejectedExecutionHandler">
    <ref local="rejectedExecutionHandler" />
    </property>
    </bean>
    //in code
    userThreadPool.execute(thread);

    3、

    线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。

    说明:

    使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。

    如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。


    ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() .setNameFormat("demo-pool-%d").build();

    ExecutorService singleThreadPool
    = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1024),
    namedThreadFactory,
    new ThreadPoolExecutor.AbortPolicy());
    singleThreadPool.execute(()
    -> System.out.println(Thread.currentThread().getName())); singleThreadPool.shutdown();



  • 相关阅读:
    NVIDIA显卡的利用率“Volatile GPU Util"是什么???
    歌曲《佳人伴孤灯》到底适合不适合作为婚庆歌曲???
    shell脚本替换jar包中的fastjson版本
    读书郎平板定时截图监控平板屏幕内容
    selenium 使用使用已经打开的浏览器
    【python】'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline
    银行业云原生转型建议
    【python】Django入门例子
    【系统设计】FMEA(Fail Model and Effect Analysis)故障模式与影响分析(又称失效模式与后果分析、失效模式与效应分析、故障模式与后果分析)
    Activiti6.0下activitiapp实现一个简单请假流程
  • 原文地址:https://www.cnblogs.com/liran123/p/13323049.html
Copyright © 2020-2023  润新知