Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java线程池执行器可以';不要创建本机线程_Java_Multithreading_Threadpoolexecutor - Fatal编程技术网

java线程池执行器可以';不要创建本机线程

java线程池执行器可以';不要创建本机线程,java,multithreading,threadpoolexecutor,Java,Multithreading,Threadpoolexecutor,我需要在我的系统中有一个全局线程池来处理客户的订单。该系统基于tomcat,应全天候接受客户的请求。我使用的ThreadPoolExecutor如下所示: private ThreadPoolExecutor exec = new ThreadPoolExecutor(100, 1000, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue()); 但有时我的系统会出现异常:“OutOfMemory:无法创建新的本机线程”。因此,问题是: 1.在池关

我需要在我的系统中有一个全局线程池来处理客户的订单。该系统基于tomcat,应全天候接受客户的请求。我使用的ThreadPoolExecutor如下所示:

 private ThreadPoolExecutor exec = new ThreadPoolExecutor(100, 1000, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue());
但有时我的系统会出现异常:“OutOfMemory:无法创建新的本机线程”。因此,问题是: 1.在池关闭之前,所有提交的线程是否将永远驻留在池中? 2.我应该使用什么来创建一个线程池,它可以重用或清理已完成的任务,这样它就永远不会挂起

我还在pool.submit之前添加了一条日志消息:

logger.info("Active count: "+pool.getActiveCount()+" completed: "+pool.getCompletedTaskCount());

但活动计数始终为零。为什么?java版本是FreeBSD上的openJDK 8

太多事情可能会出错,显而易见的是:

  • maximumPoolSize
    设置为1000,这是一个神奇的数字,与运行程序的硬件无关

  • <> >代码>背压< /代码>,您使用<代码> LinkedBlockingQueue < /代码>欢迎任何新任务,您可能需要考虑使用<代码> ArrayBlockingQueue < />代码,并给出<代码>容量 >

    。 配置
    maximumPoolSize
    取决于您的应用程序,您的任务
    compute-bound
    ?那么,如果池大小大于生产机器(而不是开发机器)上可用的内核数量,那么除了支付上下文切换和内存消耗的开销之外,您不会得到任何好处

    Java中有一个非常有用的方法,它可以获取您拥有的内核数,请使用它

    Runtime.getRuntime().availableProcessors();  
    

    1) 你看过文件了吗(只有核心部分会看)?也许是一个固定大小的游泳池?这要看情况了。你需要那么多线吗?您的系统有1000个内核,实际上可以并行完成1000件事情吗?@zapl如果任务是IO绑定的,那么拥有一个大于cores@SleimanJneidi千丝万缕就是很多。即使一百条线也是很多。无论该服务将在什么硬件上运行,它每秒可以处理的并发客户端数和请求数都有实际限制。诀窍是,设计一个在压力下优雅降级的系统,而不是简单地在OOM错误上崩溃。@jameslarge有很多人可以买得起拥有100个内核和TB内存的机器,也许OP就是其中之一:)@SleimanJneidi,好吧,也许一千个线程并不总是很多,但是OP的系统显然已经没有线程了。即使是最大的服务器,如果你使劲推它们,也会耗尽一些资源,诀窍仍然是在不越界的情况下优雅地降低性能,而不是越界并崩溃。一个适当配置的线程池是实现这一目标的工具之一。谢谢,但是核心大小应该等于处理器数,还是仅仅是N*processorsNumber?因此,如果我有4个处理器,我可以指定我的内核大小为16、32或仅4个吗?Thanks@avalon同样,这取决于任务,计算绑定的任务与IO绑定的任务非常不同。这些任务处理的是rabbitMQ+不同的计算+groovy我当前的问题是线程似乎卡在TPE中,就像仍然活着一样,但getActiveCount始终为0。@avalon我相信groovy是语言而不是任务