java 如何根据内存占用情况调整开线程的数量?
澳门银河官网
澳门银河官网
当前位置 : 澳门银河官网 > 澳门银河官网网址

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

怎样获取当前 jvm 的线程的内存占用情况。

ThreadPoolExecutor 的 setMaximumPoolSize 方法是动态有效的么,我能在执行的过程中调整最大执行数么?

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 setMaximumPoolSizeint 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 executeRunnable command {
        if command == null
            throw new NullPointerException;
        if poolSize >= corePoolSize || !addIfUnderCorePoolSizecommand {
            if runState == RUNNING && workQueue.offercommand {
                if runState != RUNNING || poolSize == 0
                    ensureQueuedTaskHandledcommand;
            }
            else if !addIfUnderMaximumPoolSizecommand
                rejectcommand; // is shutdown or saturated
        }
    }

广告位

澳门银河官网