"Java 中通过以下代码创建线程池,\nprivate static ExecutorService newExecutor() {\n int threads = Globals.getIntProperty(Constant.BUSI_THREADS_KEY, Constant.DEFAULT_BUSI_THREADS);\n int queues = Globals.getIntProperty(Constant.BUSI_QUEUES_KEY, Constant.DEFAULT_BUSI_QUEUES);\n return new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS,\n queues == 0 ? new SynchronousQueue<>() : new LinkedBlockingQueue<>(queues),\n new ThreadFactory() {\n private final AtomicInteger mThreadNum = new AtomicInteger(1);\n private final ThreadGroup mGroup = System.getSecurityManager() == null\n ? Thread.currentThread().getThreadGroup() : System.getSecurityManager().getThreadGroup();\n\n @Override\n public Thread newThread(Runnable r) {\n String name = "TR069-WORK-THREAD-" + mThreadNum.getAndIncrement();\n Thread ret = new Thread(mGroup, r, name, 0);\n ret.setDaemon(true);\n return ret;\n }\n }, (r, e) -> {\n String msg = String.format(\n "Thread pool is EXHAUSTED!\n + " Thread Name: TR069-WORK, Pool Size: %d (active: %d, core: %d, max: %d, largest: %d), Task: %d (completed: %d),\n + " Executor status:(isShutdown:%s, isTerminated:%s, isTerminating:%s)!",\n e.getPoolSize(), e.getActiveCount(), e.getCorePoolSize(), e.getMaximumPoolSize(),\n e.getLargestPoolSize(), e.getTaskCount(), e.getCompletedTaskCount(), e.isShutdown(),\n e.isTerminated(), e.isTerminating());\n logger.warn(msg);\n throw new RejectedExecutionException(msg);\n }\n );\n }\n往该threadpoolexecutor中塞入1000个请求,最后只有线程号511跟512在运行,且请求未丢失,是怎么回事\n\n内容:根据提供的代码,创建的线程池是一个自定义的ThreadPoolExecutor。根据代码中的参数设置,线程池的核心线程数和最大线程数都是threads,任务队列的大小是queues。线程池的拒绝策略是当任务无法加入队列时,直接抛出RejectedExecutionException异常。\n\n往该线程池中塞入1000个请求时,如果线程池中的线程数量小于核心线程数(threads),新的任务会创建一个新的线程来处理。如果线程池中的线程数量大于等于核心线程数,但小于最大线程数,新的任务会加入到任务队列中等待执行。如果任务队列已满,但线程池中的线程数量仍未达到最大线程数,新的任务会创建一个新的线程来处理。如果线程池中的线程数量已经达到最大线程数,且任务队列已满,则会触发拒绝策略,抛出RejectedExecutionException异常。\n\n根据问题描述,只有线程号511和512在运行,说明线程池中的线程数量已经达到最大线程数,并且没有任务被拒绝。这可能是因为任务的执行时间比较长,导致线程池中的其他线程还在执行之前的任务,没有空闲来处理新的任务。如果希望所有的任务都立即执行,可以考虑增加线程池的最大线程数或者减少任务的执行时间。\n\n总结:线程池中的线程数量达到最大线程数后,新的任务会加入到任务队列中等待执行。如果任务队列已满,且线程池中的线程数量已经达到最大线程数,则会触发拒绝策略。线程池的拒绝策略可以根据实际需求进行定制。\n\n"

Java 线程池 ThreadPoolExecutor 详解:分析线程数量限制与请求处理

原文地址: https://www.cveoy.top/t/topic/mfFB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录