java 如何根据内存占用情况调整开线程的数量?
问题描述
问题解答
回答1:setMaximumPoolSize 是否动态有效看下jdk源码不就知道了
/** * Sets the maximum allowed number of threads. This overrides any * value set in the constructor. If the new value is smaller than * the current value, excess existing threads will be * terminated when they next become idle. * * @param maximumPoolSize the new maximum * @throws IllegalArgumentException if the new maximum is * less than or equal to zero, or * less than the {@linkplain #getCorePoolSize core pool size} * @see #getMaximumPoolSize */ public void setMaximumPoolSize(int maximumPoolSize) {if (maximumPoolSize <= 0 || maximumPoolSize < corePoolSize) throw new IllegalArgumentException();final ReentrantLock mainLock = this.mainLock;mainLock.lock();try { int extra = this.maximumPoolSize - maximumPoolSize; this.maximumPoolSize = maximumPoolSize; if (extra > 0 && poolSize > maximumPoolSize) {try { Iterator<Worker> it = workers.iterator(); while (it.hasNext() && extra > 0 && poolSize > maximumPoolSize) {it.next().interruptIfIdle();--extra; }} catch (SecurityException ignore) { // Not an error; it is OK if the threads stay live} }} finally { mainLock.unlock();} }
execute方法:
/** * Executes the given task sometime in the future. The task * may execute in a new thread or in an existing pooled thread. * * If the task cannot be submitted for execution, either because this * executor has been shutdown or because its capacity has been reached, * the task is handled by the current <tt>RejectedExecutionHandler</tt>. * * @param command the task to execute * @throws RejectedExecutionException at discretion of * <tt>RejectedExecutionHandler</tt>, if task cannot be accepted * for execution * @throws NullPointerException if command is null */ public void execute(Runnable command) {if (command == null) throw new NullPointerException();if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) { if (runState == RUNNING && workQueue.offer(command)) {if (runState != RUNNING || poolSize == 0) ensureQueuedTaskHandled(command); } else if (!addIfUnderMaximumPoolSize(command))reject(command); // is shutdown or saturated} }
相关文章:
1. android - Manifest.xml自己生成的GMS服务怎么删掉呢?2. java - git项目迁移到SVN怎么实现的?哪位大神指点指点3. css - 手机app中rem的基准值计算错误4. php如何单独提取出不满足条件的字符串5. 绘制图表的问题6. ThinkPHP5实战之教学系统7. 为什么要通过常量的方式拐弯抹角的写呢,直接写DSN之类的不好吗8. 关于thinkphp 5.1中,ajax提交数据url的格式写法,加花括号就出错,请老师指点9. 大佬们,这个连接数据库的哪里错了,登录后台进不去10. 站点内容复制额外增加的版权申明,真的很反人类。试问产品自己在用这个站点吗?

网公网安备