Question d'entretien pour Développeur Java

Que sont les threads virtuels, et en quoi changent-ils la façon d'écrire du code serveur ?

Ce que le recruteur cherche à évaluer, comment structurer votre réponse et un exemple parlé à adapter.

Réponse rapide

Les threads virtuels, définitifs depuis Java 21, sont des threads légers ordonnancés par la JVM sur un petit pool de threads porteurs. Quand l'un d'eux se bloque sur une entrée/sortie, il se démonte et libère son porteur, donc un million de tâches concurrentes coûtent très peu. Concrètement, vous réécrivez du code bloquant simple et vous utilisez un thread par requête plutôt qu'un executor à pool fixe, et vous ne mettez jamais les threads virtuels dans un pool parce qu'en créer un ne coûte rien.

Pourquoi les recruteurs posent cette question

C'est le plus gros changement de la concurrence Java depuis dix ans, donc cela sépare ceux qui suivent la plateforme de ceux qui se sont arrêtés à Java 8. Le recruteur veut entendre le mécanisme de démontage, le fait que les threads virtuels aident sur les entrées/sorties bloquantes et pas sur le travail limité par le CPU, et que les mettre dans un pool est un antipattern. Cela ouvre aussi sur le pinning, les variables ThreadLocal et la façon dont vous limitez désormais la concurrence.

Comment structurer votre réponse

  • Définissez-les comme des threads ordonnancés par la JVM, à création peu coûteuse.
  • Expliquez le montage et le démontage sur un thread porteur pendant les appels bloquants.
  • Dites ce qui change dans votre code : un thread par tâche, pas de pool.
  • Nommez les limites : travail limité par le CPU, pinning, coût des ThreadLocal.

Exemple de réponse

Exemple parlé, à la première personne

Un thread virtuel est ordonnancé par la JVM plutôt que par le système d'exploitation, donc il coûte quelques centaines d'octets au lieu d'un mégaoctet de pile. Quand il se bloque sur une lecture de socket, il se démonte de son thread porteur et ce porteur part exécuter autre chose, puis il se remonte quand les données arrivent. Autrement dit, la vieille raison de mettre les threads dans un pool disparaît. J'utilise un executor qui crée un thread virtuel par tâche, et le code reste du bloquant tout simple, bien plus facile à lire et à déboguer qu'une chaîne de callbacks. Je garde deux choses en tête. D'abord, ils n'apportent rien au travail limité par le CPU, puisque vous n'avez toujours que le nombre de cœurs que vous avez ; le gain est sur le traitement de requêtes lourdes en entrées/sorties. Ensuite, ils suppriment la limite de concurrence accidentelle que me donnait un pool fixe, donc si j'appelle une base de données avec un pool de cinquante connexions, je place un sémaphore ou le pool lui-même devant, sinon dix mille threads virtuels s'y jettent d'un coup.

Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.

Voir comment ça marche

Questions de relance à prévoir

  • Qu'est-ce qui provoque le pinning d'un thread virtuel sur son porteur, et est-ce encore un problème ?
  • Comment limitez-vous la concurrence vers une ressource en aval sans pool de threads ?
  • Pourquoi les ThreadLocal coûtent-elles plus cher quand vous avez un million de threads ?

Autres questions pour Développeur Java

Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.

Prédire mes questions

Répétez les questions difficiles avant qu'on vous les pose

Entraînez-vous avec un copilote en direct, puis présentez-vous prêt. Un Session Pass à $29 vous accompagne pendant l'entretien, sans abonnement et sans engagement.

Obtenir GhostPilot