Jdk源码详解之ArrayBlockingQueue类

Jdk源码详解之ArrayBlockingQueue类

/**
    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 {@code RejectedExecutionHandler}.
     如果任务不能被提交执行,要么是因为这个executor已经被关闭,或者是因为它的容量已经达到最大,
	 那么这个任务将会提交给RejectedExecutionHandler处理。
	 
     @param command the task to execute
     @throws RejectedExecutionException at discretion of
             {@code RejectedExecutionHandler}, if the task
             cannot be accepted for execution
     @throws NullPointerException if {@code command} is null
     */
    public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        /*
         * Proceed in 3 steps:
         *
         * 1. If fewer than corePoolSize threads are running, try to
         * start a new thread with the given command as its first
         * task.  The call to addWorker atomically checks runState and
         * workerCount, and so prevents false alarms that would add
         * threads when it shouldn't, by returning false.
         *
         * 2. If a task can be successfully queued, then we still need
         * to double-check whether we should have added a thread
         * (because existing ones died since last checking) or that
         * the pool shut down since entry into this method. So we
         * recheck state and if necessary roll back the enqueuing if
         * stopped, or start a new thread if there are none.
         *
         * 3. If we cannot queue task, then we try to add a new
         * thread.  If it fails, we know we are shut down or saturated
         * and so reject the task.
         */
        int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);
    }

你可能感兴趣的:(#,Java,JDK源码解读)