runWorker方法
执行任务的流程,并且加入了中断的判断
//执行任务 final void runWorker(ThreadPoolExecutor.Worker w) { // 拿到当前的工作线程 Thread wt = Thread.currentThread(); // 拿到Worker对象中封装的任务 Runnable task = w.firstTask; // 将Worker的firstTask归位 w.firstTask = null; // 将Worker的state归位为0,代表可以被中断 w.unlock(); // allow interrupts // 标识:任务执行时,勾子函数是否出现异常 boolean completedAbruptly = true; try { // 获取任务的第一个方式,就是执行execute submit时,传入的任务直接处理 // 获取任务的第二个方式,就是从工作队列中获取任务执行 while (task != null || (task = getTask()) != null) { // 加锁,在SHUTDOWN状态下,当前线程不允许被中断 // 并且Worker内部实现的锁并不是可重入锁,因为在中断时,也需要对Worker进行lock,不能获取这把锁就代表当前工作线程正在执行任务,此时不能中断 w.lock(); // 如果线程状态变为stop状态,必须将当前线程中断 // 第一个判断:当前线程池是否为stop // 第二个判断:查看中断标记位并归位,如果为false,说明不是stop,如果变为true,需要再次查看是否是并发操作导致线程池stop状态 // 总之,只要线程池状态为stop,就把中断标记为变为true if ((runStateAtLeast(ctl.get(), STOP) || (Thread.interrupted() && runStateAtLeast(ctl.get(), STOP))) && // 查询当前线程中断标记是否为false ,如果为false ,执行 !wt.isInterrupted()) // 将中断标记为设置为true wt.interrupt(); try { // 任务执行时的钩子函数 beforeExecute(wt, task); Throwable thrown = null; try { // 执行任务 task.run(); } catch (RuntimeException x) { thrown = x; throw x; } catch (Error x) { thrown = x; throw x; } catch (Throwable x) { thrown = x; throw new Error(x); } finally { // 任务执行时的勾子函数 afterExecute(task, thrown); } } finally { // 任务执行完毕后将task置为null task = null; // 执行成功的任务个数+1 w.completedTasks++; // 将state标记为置为0 w.unlock(); } } completedAbruptly = false; } finally { processWorkerExit(w, completedAbruptly); } }