PauseableThreadPool的例子中会有并发执行钩子函数的情况吗
来源:3-8 钩子方法

深海的星星15138
2020-04-09
老师,有个小问题,ThreadPoolExecutor是怎么执行每个任务的?我看了execute()的源码,它就是把传入的task通过addWorker()方法加入到一个Worker集合里面,但是我没找到什么时候让这个Worker集合里面的worker去执行。我就是不太懂这个beforeExecute()钩子函数到底是由线程池对象去执行还是由线程池里面的线程自己去执行?如果是线程池对象去执行的话,那在这个例子中,是不是应该不会出现并发的执行这个beforeExecute()函数的情况(因为我们创建的线程池对象只是在主函数里创建并被用到的)?
我觉得钩子函数应该是每个线程自己执行的吧?也就是会有并发的执行钩子函数的情况?因为这个内部类Worker实际上是个runnable,而它里面有一个thread属性,在它构造方法里thread被创建,并且这个thread的runnable就是这个worker自己,所以我理解的这个workers集合是当前线程池中正在运行的所有线程?然后它在重写的run()方法里调用了一个叫runWorker()的方法,而正是在这个方法里调用了beforeExecute()钩子函数。所以,实际上执行beforeExecute()的线程是不一样的,是这个线程池中每个线程自己调用的。不知道我理解的对吗?
好像也确实是这样,我在beforeExecute()里随便打印了个东西,它确实每次打印的线程名都不一样,而且也确实是两秒打印一个,因为他们用的是同一个线程池对象的锁。
2回答
-
悟空
2020-04-10
是每个线程自己执行的,相当于把这部分内容补充到每个任务前面,其他都不变。
你理解的对的
10 -
深海的星星15138
提问者
2020-04-10
老师不知道我理解的对吗?
00
相似问题