1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| /** * 执行入口 * * 三步操作 * * 1. 如果当前运行的线程数<核心线程数,创建一个新的线程执行任务,调用addWorker方法原子性地检查 * 运行状态和线程数,通过返回false防止不需要的时候添加线程 * 2. 如果一个任务能够成功的入队,仍然需要双重检查,因为我们添加了一个线程(有可能这个线程在上次检查后就已经死亡了) * 或者进入此方法的时候调用了shutdown,所以需要重新检查线程池的状态,如果必要的话,当停止的时候要回滚入队操作, * 或者当线程池为空的话创建一个新的线程 * 3. 如果不能入队,尝试着开启一个新的线程,如果开启失败,说明线程池已经是shutdown状态或饱和了,所以拒绝执行该任务 */ public void execute(Runnable command) { if (command == null) throw new NullPointerException(); // 获取当前线程池的控制状态 int c = ctl.get(); // 如果当前运行的线程数<核心线程数 if (workerCountOf(c) < corePoolSize) { // 调用addWorker方法原子性地检查运行状态和线程数,通过返回false防止不需要的时候添加线程 // 添加worker,成功则返回,下面再解析这个方法 if (addWorker(command, true)) return; // 不成功则再次获取线程池控制状态 c = ctl.get(); } // 线程池处于RUNNING状态,将命令(用户自定义的Runnable对象)添加进workQueue队列 if (isRunning(c) && workQueue.offer(command)) { // 再次检查,获取线程池控制状态 int recheck = ctl.get(); // 线程池不处于RUNNING状态,将命令从workQueue队列中移除 if (! isRunning(recheck) && remove(command)) // 拒绝执行命令 reject(command); // worker数量等于0,添加worker else if (workerCountOf(recheck) == 0) addWorker(null, false); } // 添加worker失败,拒绝执行命令 else if (!addWorker(command, false)) reject(command); }
|