Closed OrientationZero closed 1 year ago
可以执行完成后将线程中的上下文全部清除掉吗?
可以。Transmitter#clear()
方法用于清除所有线程上下文。 @OrientationZero
# 严格的说,清理的是TTL
管理的所有线程上下文,包含注册给TTL
的ThreadLocal
实例。
TTL
自己的实现逻辑中也有使用,在DisableInheritableThreadFactoryWrapper
:
因为可能线程池执行任务的频次不高,并且每次调用线程的上下文也都不一样,这样线程池中无用的上下文在下次调用之前会一直在内存中了
这个问题的解决方法是
TTL
有讨论 & 提供了相应的功能实现: @OrientationZero
TTL
已实现的功能,即上面举例的DisableInheritableThreadFactoryWrapper
:
https://github.com/alibaba/transmittable-thread-local/blob/86342990806ef94280941e31e529597ab775f611/src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java#L173-L197要不要 「默认」执行完成后将线程中的上下文全部清除掉,要看这样做是不是安全合理的。
简单看看,这样的做法不安全;执行完成后恢复上下文(不做全部清除),可以让外层的执行不受内层上下文变化的影响,这样是确定可控。
线程池每次执行完成后默认将上下文还原至调用线程的上下文原状,可以执行完成后将线程中的上下文全部清除掉吗? 因为可能线程池执行任务的频次不高,并且每次调用线程的上下文也都不一样,这样线程池中无用的上下文在下次调用之前会一直在内存中了