ThreadLocal с завершаемыми фьючерсами в Java - PullRequest
0 голосов
/ 09 апреля 2020

Передает ли Completable будущий поток в контексте threadLocal не асинхронной c версии методов, таких как thenApply (), thenCompose () et c автоматически?

Легко понять, когда оба этапа выполняются те же темы. Что происходит, когда два связанных этапа выполняются двумя разными потоками?

e.g. obtainFuture().thenApply(); // obtainFuture() does work and returns a completable future


Вот частичный пример из кода.

 private CompletableFuture<Void> graphDFS(v, args...)
    log.info("ThreadName: {} QueryId: {}", Thread.currentThread().getName(), threadLocalUtils.getQueryId());
    if (over Limit) {
      return CompletableFuture.completedFuture(null);
    } else {
      List<CompletableFuture<Void>> futures = new ArrayList<>();
      for (Vertices v : vertices) {
        futures.addAll(
            forEachVertexAsync(v) // Returns list of completable futures of vertices
                .stream()
                .map(
                    future ->
                        future.thenCompose(
                            nextVertices ->
                                graphDFS(nextVertices, args...)  
                .collect(Collectors.toList()));
      }
      return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
    }
  }

Когда он переходит на следующую глубину, он использует другой поток но сохраняет контекст threadLocal.

Мне показалось удивительным, что, когда эти два stags выполняются двумя разными потоками, второй поток может получить контекст threadLocal из потока предыдущего этапа.

Я не могу этого предпринять. В документации ThreadLocal говорится, что информация ThreadLocal является локальной для потоков, тогда как это работает?

Спасибо!

...