Вот пример для передачи текущего LocaleContext в родительском потоке в дочерний поток, охватываемый CompletableFuture [по умолчанию он использовал ForkJoinPool].
Просто определите все, что вы хотели сделать в дочернем потоке внутри блока Runnable. Поэтому, когда CompletableFuture выполняет блок Runnable, его дочерний поток контролирует и вуаля, у вас есть родительский поток ThreadLocal, установленный в дочернем ThreadLocal.
Проблема здесь не в том, что весь ThreadLocal скопирован. Только LocaleContext копируется. Поскольку ThreadLocal имеет частный доступ только к потоку, он тоже принадлежит с помощью Reflection, и попытка получить и установить его в Child - слишком много дурацких вещей, которые могут привести к утечкам памяти или снижению производительности.
Так что, если вы знаете интересующие вас параметры из ThreadLocal, то это решение работает намного чище.
public void parentClassMethod(Request request) {
LocaleContext currentLocale = LocaleContextHolder.getLocaleContext();
executeInChildThread(() -> {
LocaleContextHolder.setLocaleContext(currentLocale);
//Do whatever else you wanna do
}));
//Continue stuff you want to do with parent thread
}
private void executeInChildThread(Runnable runnable) {
try {
CompletableFuture.runAsync(runnable)
.get();
} catch (Exception e) {
LOGGER.error("something is wrong");
}
}