关于线程池报unable to create new native thread
最近应公司要求需要用线程池来管理多线程,一直没有深入接触过线程池,靠百度大婶,终于写出一个:
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 20, 1,TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(15),new ThreadPoolExecutor.DiscardOldestPolicy());
//10是表示允许10个线程,20是最多可以有20个线程在进行或等待,1线程池维护线程所允许的空闲时间为1秒,TimeUnt.SECONDS线程池维护线程所允许的空闲时间的单位以秒为单位,下一个参数是指线程池所使用的缓冲队列为有界队列,最后一次参数是线程池对拒绝任务的处理策略抛弃旧的任务
for(int i=0;i<size;i++){
Map map=(Map) list.get(i);
String orderid = (String) map.get("orderid");
String account=(String) map.get("account");
String facesum=(String) map.get("money");
if(orderid!=null&&account!=null&&facesum!=null){
threadPool.execute(new Chongzhi1Add(orderid,account,facesum,ordersService));
Thread.sleep(produceTaskSleepTime);
}
}
但是现在问题是,程序跑一段时间后,在threadPool.execute(new Chongzhi1Add(orderid,account,facesum,ordersService));这句的时候报unable to create new native thread这个异常,重启后就好了,跑一段又报这个异常,我从网上看到说,使用有界queue可能不能很好的满足性能,需要调节线程数和queue大小,但是怎么调整呢,要怎样避免这个异常呢???请大家赐教,谢谢了!
------解决方案--------------------你的Chongzhi1Add类都做了什么?如果不是频繁大量并发的操作,就出现了这类问题,可以排查下Chongzhi1Add类是否有可优化的地方。如果并发量大、频繁,可以把初始化容量改大一点(我们项目默认的是配了10000),当然,要考虑服务器的配置情况。
------解决方案--------------------ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 20, 1,TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(15),new ThreadPoolExecutor.DiscardOldestPolicy());
//10是表示允许10个线程,
//20是最多可以有20个线程在进行或等待,
//1线程池维护线程所允许的空闲时间为1秒,
//TimeUnt.SECONDS线程池维护线程所允许的空闲时间的单位以秒为单位,
//下一个参数是指线程池所使用的缓冲队列为有界队列,
//最后一次参数是线程池对拒绝任务的处理策略抛弃旧的任务
(1)有界队列太小了,设置的大一点!
(2)maxsize可能有点大,设置的小一点
(3)空闲时间可以设置的大一点