Angenommen Sie anrufen Code, der Blöcke in einem Future
:
seit Zukunft ExecutionContext
verwendet. Bedeutet es, dass ein Thread in diesem Thread-Pool während der Ausführung des darin enthaltenen Codes durch diese Zukunft blockiert wird?
Im Wesentlichen ja. Wenn Sie den Sperrcode aufrufen, muss etwas blockiert werden. Ein ExecutionContext
ist jedoch allgemeiner als ein Thread-Pool. Es kann Thread-Pool sein, aber es kann auch etwas sein, das Anrufe auf andere Weise verwaltet. Trotzdem wird etwas blockiert, meistens wird es ein roter Faden sein. scala.concurrent.ExecutionContext.Implicits.global
ist beispielsweise ein ForkJoinPool
.
Welcher Thread wird genau den Rückruf aufrufen?
Das ist meist bis zu der ExecutionContext
zu entscheiden. Sie können Thread.currentThread
in Ihrem Rückrufcode drucken, aber es gibt keinen Grund (außer vielleicht Debugging), warum Sie diese Informationen wirklich wissen müssen. Dein Code sollte das sicher nicht wissen müssen. In der Regel bedeutet dies den nächsten verfügbaren Thread im Pool, bei dem es sich um den gleichen Thread handeln könnte, der den Körper des Future
oder einen anderen Thread ausgeführt hat. Es scheint, dass derselbe Thread, der das Original Future
ausführt, die Rückrufe absetzt, aber nur für die Ausführung plant.
Wie wird es herausfinden, dass die Codeausführung in dieser Zukunft abgeschlossen ist?
onComplete
Aufruf wird entweder sofort ausgeführt werden, wenn der Basiswert Promise
der Future
im fertigen Zustand ist, oder ein CallbackRunnable
wird auf eine Liste von Hörern hinzugefügt werden, ausgeführt werden, wenn das Versprechen abgeschlossen ist. DefaultPromise#tryComplete
ruft die Listener unmittelbar nach der Ausführung der Berechnung auf. Siehe this excerpt des aktuellen Codes.
Sie könnten die ID des Threads innerhalb der Zukunft überprüfen, um zu sehen, welche Threads es ist. – Carcigenicate