Java 使主线程等待上下文被子线程复制

Java 使主线程等待上下文被子线程复制,java,multithreading,spring-boot,Java,Multithreading,Spring Boot,我正在进行一个流程,该流程执行以下任务: 1.Kafka Consumer consumes kafka message and does some task A 2.It then starts an async process using @Async in spring boot 3.It clears the context and exits 我使用TaskDecorator将上下文传递给Async public class AsyncTaskDecorator implements

我正在进行一个流程,该流程执行以下任务:

1.Kafka Consumer consumes kafka message and does some task A
2.It then starts an async process using @Async in spring boot
3.It clears the context and exits
我使用TaskDecorator将上下文传递给Async

public class AsyncTaskDecorator implements TaskDecorator {
   ContextProvider provider = ContextProvider.getContext();
}

下面是我的ContextProvider类

private static final ThreadLocal<CountryContextProvider> CONTEXT = new ThreadLocal<>();
 public static void clear() {
     CONTEXT.clear();
 }
private static final ThreadLocal CONTEXT=new ThreadLocal();
公共静态无效清除(){
CONTEXT.clear();
}
我面临的问题是,在子线程可以使用ContextProvider=ContextProvider.getContext()复制它之前,父线程在上下文上调用clear


如何确保子线程能够在父线程调用清除之前获取上下文。此外,我不能让主线程等待子线程,使用Async的关键是允许子线程独立执行。

您可以而且应该做的是从父线程中删除上下文清除操作,并将其委托给子线程本身。您可以编写AsyncTaskDecorator,如下所示

public class AsyncTaskDecorator implements TaskDecorator {
   public Runnable decorate(Runnable runnable) {
      return () -> {
          try {
              ContextProvider provider = ContextProvider.getContext();
              // Use it here
          } finally {
              ContextProvider.getContext().clear();
          }
      };
   }
}

不能这样做,因为我们不能假设在非异步部分中没有异常。如果在调用async之前有任何异常,则永远不会清除上下文