Interviewfrage für Java-Entwickler

Was sind Virtual Threads, und wie verändern sie die Art, wie du Server-Code schreibst?

Worauf der Interviewer abzielt, wie du deine Antwort aufbaust und ein gesprochenes Beispiel zum Anpassen.

Kurzantwort

Virtual Threads, final seit Java 21, sind leichtgewichtige Threads, die von der JVM auf einen kleinen Pool von Carrier Threads geschedult werden. Blockiert einer auf I/O, wird er ausgehängt und gibt seinen Carrier frei, deshalb kosten eine Million gleichzeitige Tasks fast nichts. Praktisch heißt das: du schreibst wieder geradlinigen blockierenden Code und nimmst einen Thread pro Request statt eines Executors mit festem Pool, und du poolst Virtual Threads nie, weil das Erzeugen billig ist.

Warum Interviewer das fragen

Das ist die größte Änderung an Javas Nebenläufigkeit seit einem Jahrzehnt, also trennt sie Leute, die die Plattform verfolgen, von Leuten, die bei Java 8 stehen geblieben sind. Der Interviewer will das Mount- und Unmount-Verhalten hören, dass Virtual Threads bei blockierendem I/O helfen und nicht bei CPU-lastiger Arbeit, und dass Pooling ein Antipattern ist. Das öffnet außerdem Pinning, Thread Locals und die Frage, wie du Nebenläufigkeit jetzt begrenzt.

So baust du deine Antwort auf

  • Definiere sie als von der JVM geschedulte Threads mit billiger Erzeugung.
  • Erkläre Mounting und Unmounting auf einem Carrier Thread während blockierender Aufrufe.
  • Sag, was sich in deinem Code ändert: ein Thread pro Task, kein Pooling.
  • Nenn die Grenzen: CPU-lastige Arbeit, Pinning, Kosten von Thread Locals.

Beispielantwort

Gesprochenes Beispiel, erste Person

Ein Virtual Thread wird von der JVM geschedult und nicht vom Betriebssystem, deshalb kostet er ein paar hundert Byte statt einem Megabyte Stack. Blockiert er auf einem Socket-Read, hängt er sich von seinem Carrier Platform Thread aus, der Carrier läuft weg und macht etwas anderes, und wenn die Daten da sind, hängt er sich wieder ein. Damit fällt der alte Grund fürs Thread-Pooling weg. Ich nehme einen Executor, der pro Task einen Virtual Thread erzeugt, und der Code bleibt schlichter blockierender Code, der sich viel leichter lesen und debuggen lässt als eine Kette von Callbacks. Zwei Dinge behalte ich im Kopf. Erstens bringen sie bei CPU-lastiger Arbeit nichts, du hast immer noch nur so viele Kerne, wie du hast; der Gewinn liegt bei I/O-lastiger Request-Verarbeitung. Zweitens nehmen sie mir das versehentliche Nebenläufigkeitslimit weg, das ein fester Pool früher gegeben hat. Wenn ich also eine Datenbank mit einem Pool von fünfzig Verbindungen anspreche, setze ich eine Semaphore oder den Pool selbst davor, sonst stürzen sich zehntausend Virtual Threads auf einmal darauf.

Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.

So funktioniert es

Nachfragen, mit denen du rechnen solltest

  • Wodurch pinnt ein Virtual Thread seinen Carrier, und ist das immer noch ein Problem?
  • Wie begrenzt du die Nebenläufigkeit gegen eine Downstream-Ressource ohne Thread-Pool?
  • Warum sind Thread Locals teurer, wenn du eine Million Threads hast?

Weitere Fragen für Java-Entwickler

Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.

Meine Fragen vorhersagen

Üb die harten Fragen, bevor sie gestellt werden

Trainier mit einem Live-Copiloten und geh dann vorbereitet rein. Ein $29 Session Pass bringt dich durch das Vorstellungsgespräch, ohne Abo und ohne Bindung.

GhostPilot holen