什么时候手动创建线程而不使用线程池

本文探讨线程池的合理使用场景及注意事项,包括线程优先级设置、前后台线程的区别、手动终止线程的方法等,并提供了使用ThreadPoolExecutor而非Executors创建线程池的正例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、需要自定义线程的优先级,线程池中线程总是Normal

2、需要一个前台线程,线程池中线程是后台线程

     非UI线程最好使用线程池创建为后台线程,常常关闭一个软件之后,仍然占有内存,就是由于创建了多个前台线程,程序关闭的时候,还有其他前台线程没有关闭。

3、需要手动终止线程,线程池不具有这种功能。

4、线程执行时间长,线程池目的是为了线程重用,省去创建新线程的额外开销,多适用于多而执行时间短的线程。线程池创建线程是滞后的,不会发现线程不够立即去创建新线程,会有个延时,以确保真正的需要创建新线程。



Executors创建线程池的弊端

线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,

这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险.
说明:Executors的各个方法的弊端:
1)newFixedThreadPool和newSingleThreadExecutor:
主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM.
2)newCachedThreadPool和newScheduledThreadPool:

主要问题是线程数最多数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM.


Positive example 1:

[java]  view plain  copy
  1. //org.apache.commons.lang3.concurrent.BasicThreadFactory;  
  2.  ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(  
  3.                 1,  
  4.                 new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build()  
  5.         );  
Positive example 2:
[java]  view plain  copy
  1. ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();  
  2.        //Common Thread Pool  
  3.        ExecutorService pool = new ThreadPoolExecutor(5,200,0L,TimeUnit.MILLISECONDS,  
  4.        new LinkedBlockingDeque<Runnable>(1024),namedThreadFactory,new ThreadPoolExecutor.AbortPolicy());  
  5.        pool.execute(()-> System.out.println(Thread.currentThread().getName()));  
  6.        pool.shutdown();//gracefully shutdown  
Positive example 3:
[java]  view plain  copy
  1.     <bean id="userThreadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">  
  2.         <property name="corePoolSize" value="10"/>  
  3.         <property name="maxPoolSize" value="100"/>  
  4.         <property name="queueCapacity" value="2000"/>  
  5.         <property name="threadFactory" value="threadFactory"/>  
  6.         <property name="rejectedExecutionHandler">  
  7.             <ref local="rejectedExecutionHandler"/>  
  8.         </property>  
  9.     </bean>  
  10.   
  11. // in code   
  12.   
  13. userThreadPool.execute(thread);  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值