java 如何根据内存占用情况调整开线程的数量?

 Min2502857657_377 发布于 2022-10-25 07:45
  • php
  • 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
              }
          }
      2022-11-12 01:39 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    热门标签
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有