zoukankan      html  css  js  c++  java
  • 创建线程池注意、自定义线程池

    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();



  • 相关阅读:
    ACM题目————最短路径问题
    ACM题目————已知前序和中序求后序
    ACM题目————数素数
    ACM题目————玩转二叉树
    ACM题目————二叉树的遍历
    ACM题目————士兵杀敌(四)
    ACM题目————士兵杀敌(三)
    ACM题目————星际之门(一)
    ACM第四站————最小生成树(克鲁斯卡尔算法)
    ACM第四站————最小生成树(普里姆算法)
  • 原文地址:https://www.cnblogs.com/liran123/p/13323049.html
Copyright © 2011-2022 走看看