search

Home  >  Q&A  >  body text

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

怪我咯怪我咯2811 days ago1011

reply all(1)I'll reply

  • 巴扎黑

    巴扎黑2017-04-18 10:47:32

    If setMaximumPoolSize is dynamically valid, you will know if you look at the jdk source code

        /**
         * 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 method:

        /**
         * 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
            }
        }

    reply
    0
  • Cancelreply