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);
    }
}

 

posted on 2023-07-10 11:44  啥123  阅读(21)  评论(0编辑  收藏  举报