Woker为什么要实现AQS?
这是ThreadPoolExecutor#runWorker方法
可以看到拿到任务准备执行前要先获取锁,为什么要加锁?
1)线程池在执行shutdown方法或tryTerminate方法时会调用interruptIdleWorkers方法来中断空闲的线程,interruptIdleWorkers方法会使用tryLock方法来判断线程池中的线程是否是空闲状态;
2)1)获取不了锁说明线程正在执行任务,否则就是处于等待任务或者空闲状态,可以被中断;
另外:
之所以设置为不可重入,是因为我们不希望任务在调用像setCorePoolSize这样的线程池控制方法时重新获取锁。如果使用ReentrantLock,它是可重入的,这样如果在任务中调用了如setCorePoolSize这类线程池控制的方法,会中断正在运行的线
程。