请教一个问题, threadPoolExecutor.execute()能被 AOP 增强吗?

2021-01-18 20:02:30 +08:00
 gengzi

想在线程执行前,执行后,做一些事情

1892 次点击
所在节点    Java
8 条回复
zxlzy
2021-01-18 20:05:16 +08:00
不行,只能是 Spring 代理的类,但是你可以通过继承 ThreadPoolExecutor, 然后重载 execute() 方法实现
senninha
2021-01-18 20:15:41 +08:00
ASM 插入逻辑生成字节码,然后 redefine 。
fantastM
2021-01-18 20:42:00 +08:00
> 想在线程执行前,执行后,做一些事情

ThreadPoolExecutor 内部提供了两个钩子方法 beforeExecute(Thread, Runnable) 和 afterExecute(Runnable, Throwable),正好符合你的需求。具体的看源码就清楚了 https://github.com/openjdk/jdk/blob/jdk8-b21/jdk/src/share/classes/java/util/concurrent/ThreadPoolExecutor.java#L1098-L1130
hangszhang
2021-01-18 21:32:59 +08:00
有钩子啊, 继承 ThreadPoolExecutor 之后实现就好了
oneisall8955
2021-01-18 21:54:48 +08:00
thread/task 用 abstract 封装成 base thread,里面加个 abstract 的 before 方法,run 方法重载先执行 before 再执行具体的 execute 方法。最后具体子类实现 before ?
随便想想,不知道可不可
gengzi
2021-01-19 09:35:00 +08:00
@zxlzy
@senninha
@fantastM
@hangszhang
@oneisall8955
主要是想,不修改之前的逻辑,也能增强原有的方法。感谢各位大佬的思路,我去瞅瞅
eaglewangl37670
2021-01-19 09:51:11 +08:00
@fantastM 学到了,感谢老哥
fantastM
2021-01-19 11:21:44 +08:00
@eaglewangl37670 #7 不妨看看我博客里的这篇文章,对线程池的源码分析得更多 :)

https://blog.fantasticmao.cn/2020/10/01/java-threadpoolexecutor-源码分析 /

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/746066

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX