关于线程池报unable to create new native thread,该怎么处理


关于线程池报unable to create new native thread
最近应公司要求需要用线程池来管理多线程,一直没有深入接触过线程池,靠百度大婶,终于写出一个:

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 20, 1,TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(15),new ThreadPoolExecutor.DiscardOldestPolicy());<br />

                    //10是表示允许10个线程,20是最多可以有20个线程在进行或等待,1线程池维护线程所允许的空闲时间为1秒,TimeUnt.SECONDS线程池维护线程所允许的空闲时间的单位以秒为单位,下一个参数是指线程池所使用的缓冲队列为有界队列,最后一次参数是线程池对拒绝任务的处理策略抛弃旧的任务<br />

                    for(int i=0;i<size;i++){<br />

                        Map map=(Map) list.get(i);<br />

                        String orderid = (String) map.get("orderid");<br />

                        String account=(String) map.get("account");<br />

                        String facesum=(String) map.get("money");<br />

                        if(orderid!=null&&account!=null&&facesum!=null){<br />

                            threadPool.execute(new Chongzhi1Add(orderid,account,facesum,ordersService));<br />

                            Thread.sleep(produceTaskSleepTime);<br />

                        }<br />

                    }<br />

但是现在问题是,程序跑一段时间后,在threadPool.execute(new Chongzhi1Add(orderid,account,facesum,ordersService));这句的时候报unable to create new native thread这个异常,重启后就好了,跑一段又报这个异常,我从网上看到说,使用有界queue可能不能很好的满足性能,需要调节线程数和queue大小,但是怎么调整呢,要怎样避免这个异常呢???请大家赐教,谢谢了!

java 程序开发 Java基础知识

那毕竟是你妹 10 years, 7 months ago

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)空闲时间可以设置的大一点

litnoon answered 10 years, 7 months ago

你的Chongzhi1Add类都做了什么?如果不是频繁大量并发的操作,就出现了这类问题,可以排查下Chongzhi1Add类是否有可优化的地方。如果并发量大、频繁,可以把初始化容量改大一点(我们项目默认的是配了10000),当然,要考虑服务器的配置情况。

fliland answered 10 years, 7 months ago

Your Answer