1. /**
    2. * firstTask :第一次创建时会执行的任务
    3. core :为True时使用corePoolSize进行判别,为False时使用maxpoolSize进行判别
    4. */
    5. private boolean addWorker(Runnable firstTask, boolean core) {
    6. retry:
    7. for (;;) {
    8. int c = ctl.get();//线程数
    9. int rs = runStateOf(c);//线程池状态
    10. // Check if queue empty only if necessary.
    11. if (rs >= SHUTDOWN &&
    12. ! (rs == SHUTDOWN &&
    13. firstTask == null &&
    14. ! workQueue.isEmpty()))
    15. return false; //一些异常情况,不创建线程
    16. for (;;) {
    17. int wc = workerCountOf(c);
    18. if (wc >= CAPACITY ||
    19. wc >= (core ? corePoolSize : maximumPoolSize))
    20. return false;
    21. if (compareAndIncrementWorkerCount(c)) //这里是线程个数加一,不是真的创建线程
    22. break retry; //操作成功,退出循环,往下面走。
    23. c = ctl.get(); // Re-read ctl
    24. if (runStateOf(c) != rs)
    25. continue retry;
    26. // else CAS failed due to workerCount change; retry inner loop
    27. }
    28. }
    29. boolean workerStarted = false;
    30. boolean workerAdded = false;
    31. Worker w = null;
    32. try {
    33. w = new Worker(firstTask);
    34. final Thread t = w.thread;
    35. if (t != null) {
    36. final ReentrantLock mainLock = this.mainLock;
    37. mainLock.lock();
    38. try {
    39. // Recheck while holding lock.
    40. // Back out on ThreadFactory failure or if
    41. // shut down before lock acquired.
    42. int rs = runStateOf(ctl.get());
    43. if (rs < SHUTDOWN ||
    44. (rs == SHUTDOWN && firstTask == null)) {
    45. if (t.isAlive()) // precheck that t is startable
    46. throw new IllegalThreadStateException();
    47. // workers 是一个 HashSet
    48. // private final HashSet<Worker> workers = new HashSet<Worker>();
    49. workers.add(w); //这里worker添加到集合中,但还是没执行任务
    50. int s = workers.size();
    51. if (s > largestPoolSize)
    52. largestPoolSize = s;
    53. workerAdded = true;
    54. }
    55. } finally {
    56. mainLock.unlock();
    57. }
    58. if (workerAdded) {
    59. t.start(); //这里才开始执行任务
    60. workerStarted = true;
    61. }
    62. }
    63. } finally {
    64. if (! workerStarted)
    65. addWorkerFailed(w);//回滚操作
    66. }
    67. return workerStarted;
    68. }