关于线程池报unable to create new native thread

gwl135 2013-05-21 06:35:41
最近应公司要求需要用线程池来管理多线程,一直没有深入接触过线程池,靠百度大婶,终于写出一个:
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大小,但是怎么调整呢,要怎样避免这个异常呢???请大家赐教,谢谢了!
...全文
6832 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gwl135 2013-05-25
  • 打赏
  • 举报
回复
问题已经解决,是程序的问题,重复创建线程池了
gwl135 2013-05-23
  • 打赏
  • 举报
回复
我这个是要每天至少入库四五万笔记录的,如果改队列数和最大的话,应该改成多少合适呢
gwl135 2013-05-23
  • 打赏
  • 举报
回复
引用 5 楼 goldenfish1919 的回复:
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)空闲时间可以设置的大一点
我改成 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 15, 1,TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50),new ThreadPoolExecutor.DiscardOldestPolicy()); 还是报这个异常,虽然我改动有点少,但是我觉的就是改大了,到了一定的量还是不行的
若鱼1919 2013-05-23
  • 打赏
  • 举报
回复
引用 9 楼 gwl135 的回复:
我这个是要每天至少入库四五万笔记录的,如果改队列数和最大的话,应该改成多少合适呢
那就改成50000试试
gwl135 2013-05-22
  • 打赏
  • 举报
回复
是因为new ArrayBlockingQueue<Runnable>(15)队列满了,所以才报内存溢出的吗?new ThreadPoolExecutor.DiscardOldestPolicy()这个不是负责说如果队列慢了就将旧的线程删除吗,那他为什么会满呢……有没有哪个大神赐教一下啊……
若鱼1919 2013-05-22
  • 打赏
  • 举报
回复
tomcat本身支持的线程数就不多(默认是200),还得最多抽出20个来给你的应用程序使用! maxThreads The maximum number of request processing threads to be created by this Connector, which therefore determines the maximum number of simultaneous requests that can be handled. If not specified, this attribute is set to 200. If an executor is associated with this connector, this attribute is ignored as the connector will execute tasks using the executor rather than an internal thread pool.
若鱼1919 2013-05-22
  • 打赏
  • 举报
回复
当poolsize<coresize的时候,优先创建新的线程执行任务,执行完任务会等待从队列取任务执行 当poolsize>coresize && poolsize<maxsize的时候,会优先添加队列。 如果添加队列失败,如果poolsize<maxsize,则新建线程,执行完任务以后,超过空闲时间就关闭 如果poolsize>maxsize,则执行reject。
若鱼1919 2013-05-22
  • 打赏
  • 举报
回复
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)空闲时间可以设置的大一点
gwl135 2013-05-21
  • 打赏
  • 举报
回复
我看网上有说配置-Xms1792m -Xmx1792m -Xss1024k (thread :683) 是说在tomcat里配置吗,我现在配置是-Xms512M -Xmx512M
gwl135 2013-05-21
  • 打赏
  • 举报
回复
Chongzhi1Add类就是一个入库的类, Chongzhi1Add(String orderid,String account,String facesum,OrdersService service) { this.orderid = orderid; this.account = account; this.facesum = facesum; this.service = service; } public void run() { try { Orders order = service.query(orderid, supid); if (order == null) { Orders o = new Orders(); o.setOrderid(orderid); o.setUserid(supid); o.setAccount(account); o.setMoney(Double.parseDouble(facesum)); o.setStarttime(ToolsExecute.getTime()); o.setEndtime(ToolsExecute.getTime()); o.setState(0); o.setReturntag(0); o.setRemark(""); boolean add = service.add(o); } } 怕服务器受不了,所以才这样配置的,还有其他的方法吗,报这个异常是因为tomcat受不了,还是因为我配置的这个最大线程数少了造成的
oh_Maxy 版主 2013-05-21
  • 打赏
  • 举报
回复
你的Chongzhi1Add类都做了什么?如果不是频繁大量并发的操作,就出现了这类问题,可以排查下Chongzhi1Add类是否有可优化的地方。如果并发量大、频繁,可以把初始化容量改大一点(我们项目默认的是配了10000),当然,要考虑服务器的配置情况。

50,549

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧